详解log4net的使用

时间:2022-09-14 10:27:23

程序中只需要引用log4net.dll文件即可

配置的引用

?
1
log4net.Config.XmlConfigurator.Configure();

首先添加以上代码。

CS程序:在Main方法中添加;

BS程序:Application_Start方法中添加;

或是两者都可以在AssemblyInfo.cs(Properties中)文件里添加以下的语句:

?
1
2
3
4
//设置独立配置文件,log4net.config
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config" , Watch = true )]
//或是默认的配置文件
[assembly: log4net.Config.XmlConfigurator(Watch = true )] (配置在web.config文件中)

详细配置

log4net,可以把日志输出到控制台程序,文件,数据库、邮件,下面贴出四个输出的配置代码,其余如window日志等输出不做阐述。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <!--首先加入configSections配置节点-->
 <configSections>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
 </configSections>
 <log4net><br>
  <root>
   <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
   <!--限制日志记录级别-->
   <level value="all" />
   <!--将日志输出到文件-->
   <appender-ref ref="FileAppender"/>
   <!--将日志输出到应用程序控制台-->
   <appender-ref ref="ConsoleAppender"/>
   <!--将日志写到邮件中-->
   <!--<appender-ref ref="LogSmtpAppender"/>-->
   <!--将日志记录到数据库中。可以采用SQL和存储过程两种方式-->
   <appender-ref ref="AdoNetAppender"/>
   <!--可以同时设置多个输出对象,没用到可以注释-->
   <!--将日志写到local syslog service (仅用于UNIX环境下)。-->
   <!--<appender-ref ref="LocalSyslogAppender"/>-->
  </root><br>
  <!--发邮件-->
  <appender name="LogSmtpAppender" type="log4net.Appender.SmtpAppender">
   <authentication value="Basic" />
   <!--接受邮件的邮箱-->
   <to value="7778888@qq.com" />
   <!--发送邮件的邮箱-->
   <from value="123456@126.com" />
   <!--发送邮件的邮箱-->
   <username value="123456@126.com" />
   <!--发送邮件的邮箱密码-->
   <password value="123456" />
   <!--标题-->
   <subject value="XXX应用错误日志消息" />
   <!--smtp.qq.com-->
   <smtpHost value="smtp.126.com" />
   <bufferSize value="2048" />
   <!--超长部分是否丢弃-->
   <lossy value="true" />
   <!--日志级别 大于 WARN 的才发邮件-->
   <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="ERROR"/>
   </evaluator>
   <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value=" %level :: %message %newlineLogger: %logger%newline Date: %date%newline" />
   </layout>
  </appender><br>
  <!-- 控制台日志 -->
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
   <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%n%d{yyyy-MM-dd HH:mm:ss} %m%n" />
   </layout>
   <!--指定范围内的等级才可以被记录-->
   <!--<filter type="log4net.Filter.LevelRangeFilter">
    <param name="LevelMin" value="Info" />
    <param name="LevelMax" value="Fatal" />
   </filter>-->
  </appender >
 
  <!--指定日记记录方式,以滚动文件的方式(文件记录)-->
  <appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
   <!--日志路径-->
   <param name= "File" value= "log/"/>
   <!--是否是向文件中追加日志-->
   <param name= "AppendToFile" value= "true"/>
   <!--log保留天数-->
   <param name= "MaxSizeRollBackups" value= "10"/>
   <!--每个文件最大1M-->
   <param name="maximumFileSize" value="1MB" />
   <!--日志文件名是否是固定不变的-->
   <param name= "StaticLogFileName" value= "false"/>
   <!--日志文件名格式为:2008-08-31.log-->
   <param name= "DatePattern" value= "yyyy-MM-dd".log""/>
   <!--日志根据日期滚动-->
   <param name= "RollingStyle" value= "Date"/>
   <!--布局-->
   <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%n记录时间:%d{yyyy-MM-dd HH:mm:ss} 线程名:[%t] 级别:%p 类名:%c 信息:%m%n" />
    <param name="Header" value="----------------------------------------------------------- "/>
   </layout>
  </appender><br>
  <!--数据库日记-->
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
   <!--设置为1方便查看结果,处于性能考虑这里的值应该略大一点,官方默认值是100,BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->
   <bufferSize value="1" />
   <!--sqlserver 引用-->
   <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <!--连接数据库字符串-->
   <connectionString value="data source=.;initial catalog=test;integrated security=false;persist security info=True;User ID=sa;Password=sqlserver;" />
   <!--插入到表Log-->
   <commandText value="INSERT INTO LogTest ([Date],[Level],[Logger],[Message],[Exception],[Description],[ObjType]) VALUES (@log_date,@log_level, @logger, @message, @exception,@Description,@ObjType)" />
   <!--所有参数-->
   <parameter>
    <parameterName value="@log_date" />
    <dbType value="DateTime" />
    <layout type="log4net.Layout.RawTimeStampLayout" />
   </parameter>
   <parameter>
    <parameterName value="@log_level" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout">
     <conversionPattern value="%level" />
    </layout>
   </parameter>
   <!--类所在位置-->
   <parameter>
    <parameterName value="@logger" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
     <conversionPattern value="%logger" />
    </layout>
   </parameter>
   <parameter>
    <parameterName value="@message" />
    <dbType value="String" />
    <size value="4000" />
    <layout type="log4net.Layout.PatternLayout">
     <conversionPattern value="%message" />
    </layout>
   </parameter>
   <parameter>
    <parameterName value="@exception" />
    <dbType value="String" />
    <size value="2000" />
    <layout type="log4net.Layout.ExceptionLayout" />
   </parameter>
   <!--自定义输入字段-->
   <parameter>
    <parameterName value = "@Description"/>
    <dbType value = "String"/>
    <size value = "50"/>
    <layout type = "log4_Test.Log4netExpand.ExpandLayout">
    <conversionPattern value = "%property{Description}"/>
    </layout>
   </parameter>
   <parameter>
    <parameterName value = "@ObjType"/>
    <dbType value = "String"/>
    <size value = "50"/>
    <layout type = "log4_Test.Log4netExpand.ExpandLayout">
     <conversionPattern value = "%property{ObjType}"/>
    </layout>
   </parameter>
  </appender>
 
 </log4net>
</configuration>

 <layout type = "log4_Test.Log4netExpand.ExpandLayout"> 中的log4_Test.Log4netExpand 为命名空间

布局、格式字符说明:

%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
%r:输出自应用程序启动到输出该log信息耗费的毫秒数。
%t:输出产生该日志事件的线程名。
%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:输出日志信息所属的类目,通常就是所在类的全名。
%M:输出产生日志信息的方法名。
%F:输出日志消息产生时所在的文件名称。
%L::输出代码中的行号。
%m::输出代码中指定的具体日志信息。
%n:输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"。
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个"%"字符。
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
2)%-20c:"-"号表示左对齐。
3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

 自定义数据库插入字段(源自网络收集、整理)

1.先定义一个LogData类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace log4_Test.Log4netExpand
{
  public class LogData
  {
    /// <summary>
    /// 日志描述信息
    /// </summary>
    public string Description { get; set; }
    /// <summary>
    /// 日志描述信息
    /// </summary>
    public string ObjType { get; set; }
  }
}

2.Layout扩展类

?
1
2
3
4
5
6
7
8
9
10
namespace log4_Test.Log4netExpand
{
  public class ExpandLayout : PatternLayout
  {
    public ExpandLayout()
    {
       this.AddConverter("property", typeof(MyMessagePatternConverter));
    }
  }
}

3.MyMessagePatternConverter 类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
namespace log4_Test.Log4netExpand
{
  public class MyMessagePatternConverter: PatternLayoutConverter
  {
    protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
    {
 
      if (Option != null)
      {
 
        // Write the value for the specified key
 
        WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
 
      }
      else
      {
 
        // Write all the key value pairs
 
        WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
 
      }
    }
    /// <summary>
    /// 通过反射获取传入的日志对象的某个属性的值
    /// </summary>
    /// <param name="property"></param>
    /// <returns></returns>
    private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
    {
      object propertyValue = string.Empty;
      PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
      if (propertyInfo != null)
      {
        propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
      }
      return propertyValue;
 
    }
  }
}

4.使用代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Program
  {
    static void Main(string[] args)
    {
      
      //能看到是那个类输出
      ILog logger = log4net.LogManager.GetLogger(typeof(Program));
 
      logger.Info(new LogData { Description="123", ObjType="123"})
     
      logger.Info("消息11111111111111111111111111111");
      logger.Warn("警告");
      logger.Error("异常");
      logger.Fatal("错误");
     
    }
  }

以上所述是小编给大家介绍的log4net的使用详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://www.cnblogs.com/qiuguochao/p/6654149.html