浅谈Log4net在项目中如何记录日志
一 引入背景
在软件开发周期中,无论是开发中,或是测试中,或是上线后,选择合适的工具监控程序的运行状态至关重要,只有如此,才能更好地排查程序问题和检测程序性能问题等。本篇文章主要与大家分享,如何利用Log4net在项目中记录日志文件。在应用程序出现问题时,启用日志记录有助于解决问题。使用log4net,可以在运行时启用日志记录,而无需修改应用程序二进制文件。log4net是帮助程序员输出日志语句到各种输出目标的工具。
log4net支持如下框架:
- NET Standard 1.3 via .NET Core 1.0
- Microsoft® .NET Framework 1.0
- Microsoft .NET Framework 1.1
- Microsoft .NET Framework 2.0
- Microsoft .NET Framework 3.5
- Microsoft .NET Framework 4.0
- Microsoft .NET Framework 4.5
- Microsoft .NET Framework 3.5 Client Profile
- Microsoft .NET Framework 4.0 Client Profile
- Microsoft .NET Compact Framework 1.0
- Microsoft .NET Compact Framework 2.0
- Mono 1.0
- Mono 2.0
- Mono 3.5
- Mono 4.0
- Microsoft Shared Source CLI 1.0
- CLI 1.0 Compatible
二 log4net概述
(一)日志级别
1.级别归纳
2.级别比较
(1)级别从低=>高排序:ALL<Debug<Info<Warn<Error<Fatal<OFF
(2)日志不能记录低于最低级别的记录,如设置最低级别为Info,则低于Info的级别,都不能记录
code
测试结果
3.利用Filter过滤级别
除此之外,还能利用filter级别过滤,来设置将不同级别记录到相应文件,如将INFO级别信息记录到INFO文件中,将Error级别信息记录到Error文件中。
配置文件
后台代码
static void Main(string[] args)
{
//Log4net几种提错类型
//创建日志记录组件
ILog iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
try
{
iLog.Debug("Debug", new Exception("Debug"));
iLog.Info("Info", new Exception("Info"));
iLog.Warn("Warn", new Exception("Warn"));
iLog.Error("Error", new Exception("Error"));
iLog.Fatal("Fatal", new Exception("Fatal"));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
测试结果
(二)级别继承
级别继承很简单,归结为一句话:若本事设置了级别,则用自己的级别,若没设置级别,则继承离自己最近的级别。
例子1
例子2
例子3
例子4
(三)日志输出形式
1.输出文件形式归纳
2.项目中常用的输出形式
3.代码操作
3.1.在Root中定义日志输出媒介
<root>
<level value="ALL" />
<!--定义日志的输出媒介,如下定义四种方式-->
<!--文件形式记录日志-->
<appender-ref ref="LogFileInfoAppender" />
<!--<appender-ref ref="LogFileErrorAppender" />-->
<!--控制台显示日志-->
<appender-ref ref="ConsoleAppender" />
<!--Windows事件日志-->
<appender-ref ref="EventLogAppender" />
<!--数据库日志-->
<appender-ref ref="AdoNetAppender_Oracle" />
</root>
3.2.配置具体的媒介,如下以文件形式为例
<!--定义输出到文件中-->
<appender name="LogFileInfoAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="E:/Log/log4netInfoLog.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd-HH:mm:ss" />
<!---定义布局模板-->
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="by Alan_beijing" />
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline
日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" />
</layout>
</appender>
3.3.后台代码
class Program
{
static void Main(string[] args)
{
//Log4net几种提错类型
//创建日志记录组件
ILog iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
try
{
iLog.Debug("Debug", new Exception("Debug"));
iLog.Info("Info", new Exception("Info"));
iLog.Warn("Warn", new Exception("Warn"));
iLog.Error("Error", new Exception("Error"));
iLog.Fatal("Fatal", new Exception("Fatal"));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
3.4.测试结果
(四)定义日志输出格式
1.常用输出格式归纳
2.code及测试结果
三 代码实例
本示例是基于VS2017控制条程序写的。
1.后台
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using log4net;
using System.Reflection; [assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Log4netDemo
{
class Program
{
static void Main(string[] args)
{
//Log4net几种提错类型
//创建日志记录组件
ILog iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
try
{
iLog.Debug("Debug", new Exception("Debug"));
iLog.Info("Info", new Exception("Info"));
iLog.Warn("Warn", new Exception("Warn"));
iLog.Error("Error", new Exception("Error"));
iLog.Fatal("Fatal", new Exception("Fatal"));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}
2.配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--声明自定义节点-->
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<appSettings>
</appSettings>
<log4net>
<root>
<!--<level value="Info" />-->
<level value="ALL" />
<!--定义日志的输出媒介,如下定义四种方式-->
<!--文件形式记录日志-->
<!--<appender-ref ref="LogFile_MinLevel_Info" />-->
<appender-ref ref="LogFileInfoAppender" />
<appender-ref ref="LogFileErrorAppender" />
<!--控制台显示日志-->
<!--<appender-ref ref="ConsoleAppender" />-->
<!--Windows事件日志-->
<!--<appender-ref ref="EventLogAppender" />-->
<!--数据库日志-->
<!--<appender-ref ref="AdoNetAppender_Oracle" />-->
</root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)-->
<logger name="log4netLevel">
<!--<level value="ALL" />
<level value="DEBUG" />-->
<!--<level value="INFO" />-->
<!--<level value="WARN" />
<level value="ERROR" />-->
<!--<level value="FATAL" />
<level value="OFF" />-->
</logger>
<!--定义输出到文件中-->
<!--<appender name="LogFile_MinLevel_Info" type="log4net.Appender.FileAppender">-->
<appender name="LogFileInfoAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="E:/Log/log4netLogFile_Info.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd-HH:mm:ss" />
<!---定义布局模板-->
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="by Alan_beijing" />
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline
日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Info" />
<param name="LevelMax" value="Info" />
</filter>
</appender>
<appender name="LogFileErrorAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="E:/Log/llog4netLogFile_Error.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd-HH:mm:ss" />
<!--最大文件大小-->
<maximumFileSize value="10MB" />
<staticLogFileName value="false"/>
<!---定义布局模板-->
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="by Alan_beijing" />
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline
日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" />
</layout> <filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Error" />
<param name="LevelMax" value="Error" />
</filter>
</appender>
<!--定义输出到控制台命令行中-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--定义输出到windows事件中-->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb-->
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
<connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" />
<commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
<!--定义各个参数-->
<parameter>
<parameterName value="@logDate" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date" />
</layout>
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@logLevel" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>
</log4net> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>
四 推荐链接
【01】http://logging.apache.org/log4net/
五 服务区
有喜欢的朋友,可以看一下,不喜欢的的朋友,勿喷,谢谢!!
浅谈Log4net在项目中如何记录日志的更多相关文章
- 浅谈redux-form在项目中的运用
准则 先说一下redux的使用场景,因为如果没有redux,那更不会有redux-form. redux基于Flux架构思想,是一个状态管理框架,其目标是解决单页面应用中复杂的状态管理问题. 日常前端 ...
- 【ASP.NET MVC系列】浅谈NuGet在VS中的运用
一 概述 在我们讲解NuGet前,我们先来看看一个例子. 1.例子: 假设现在开发一套系统,其中前端框架我们选择Bootstrap,由于选择Bootstrap作为前端框架,因此,在项目中,我们 ...
- 浅谈线程池(中):独立线程池的作用及IO线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...
- 浅谈surging服务引擎中的rabbitmq组件和容器化部署
1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...
- 浅谈如何检查Linux中开放端口列表
给大家分享一篇关于如何检查Linux中的开放端口列表的详细介绍,首先如果你想检查远程Linux系统上的端口是否打开请点击链接浏览.如果你想检查多个远程Linux系统上的端口是否打开请点击链接浏览.如果 ...
- 【Unity游戏开发】浅谈Lua和C#中的闭包
一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...
- 浅谈使用spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配
浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches) spring security中的BCryptPass ...
- 在 python 项目中如何记录日志
一. 概述 写本文的目的是我在写 python 项目的时候需要记录日志,我忘记怎么处理了,每次都需要去网上查一遍,好记性不如烂笔头, 这里把查阅的内容记录下来,方便以后查找. python 项目中记录 ...
- 源码浅谈(一):java中的 toString()方法
前言: toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据. 最近项目中需要对一个ArrayList<ArrayList<Integer>> ...
随机推荐
- python基础——匿名函数及递归函数
python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...
- SpringBoot(四):banner的控制
banner在springboot中是一个支持可配(banner的样式,banner的颜色,banner的内容).是否显示. 1)banner显示内容配置: 默认springboot如果在src/re ...
- Android:ImageView控件显示图片
1)android显示图片可以使用imageView来呈现,而且也可以通过ImageButton来实现给button添加图片. 2)在创建一个ImageView后,显示图片绑定元素是:android: ...
- 1.4 正则化 regularization
如果你怀疑神经网络过度拟合的数据,即存在高方差的问题,那么最先想到的方法可能是正则化,另一个解决高方差的方法就是准备更多数据,但是你可能无法时时准备足够多的训练数据,或者获取更多数据的代价很高.但正则 ...
- Cassanfra、Hbase和MongoDB的选取
HBase比较中庸些,适合各种场景: Cassandra适合读写分离的场景,写入场景使用Cassandra,比如插入操作日志,或领域事件日志的写入: 而MongoDB适合做读写分离场景中的读取场景. ...
- spring 依赖注入时,什么时候会创建代理类
问题来源 以前一直有个疑惑,为什么我创建的controller中注入的service类有时候是代理类,有时候是普通javabean,当时能力不够,现在已经有了点经验就大胆跟了跟源码,看看到底咋回事. ...
- 技巧:如何提升Oracle用户密码的安全性
环境:Oracle 11.2.0.4 客户需求:主要背景是数据库中有很多业务用户名,且由于部分用户缺乏安全意识,甚至直接将自己的密码设置为和用户名一样,目前客户期望密码设置不要过于简单,最起码别和用户 ...
- [SDOI2016]排列计数
Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...
- 【BZOJ2733】【HNOI2012】永无乡
原题传送门 题意:给你N个带权点,一开始相互独立(每个点视为单独一个集合),有2种操作:1)合并2个集合:2)查询包含某元素集合内的权值第k小点编号. 解题思路:显然合并就是并查集,而查询则是平衡树实 ...
- ●HDU 5608 function
题链: http://acm.hdu.edu.cn/showproblem.php?pid=5608 题解: 莫比乌斯反演,杜教筛 已知$$N^2-3N+2=\sum_{d|N} f(d)$$ 多次询 ...