<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--configSections section must be the first element in configuration section-->
<configSections>
<!--using system API, doesnot support log4net.Config.XmlConfigurator.ConfigureAndWatch methods-->
<!--<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />-->
<!--read file directly for log4 setting, support the log4net.Config.XmlConfigurator.ConfigureAndWatch methods-->
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--fileAppender-->
<appender name="FileAppender1" type="log4net.Appender.FileAppender">
<file value="log-file.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!-- use the environment variable TMP to name the log file-->
<appender name="FileAppender2" type="log4net.Appender.FileAppender">
<file value="${TMP}/log-file.txt" />
<appendToFile value="true" />
<encoding value="unicodeFFFE" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--lock model, allows multiple processes to write the the same file -->
<appender name="FileAppender3" type="log4net.Appender.FileAppender">
<file value="${TMP}/log-file.txt" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--roolingFileAppender-->
<!--The file will be rolled based on a size constraint (RollingStyle).
Up to 10 (MaxSizeRollBackups) old files of 100 KB each (MaximumFileSize) will be kept.
These rolled files will be named: log.txt.1, log.txt.2, log.txt.3, etc...-->
<appender name="RollingFileAppender1" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--This example will roll the log file every minute! To change the rolling period adjust the DatePattern value.
For example, a date pattern of "yyyyMMdd" will roll every day, could dynamic change file name by date.
filename: logfile-yyyyMMdd-HHmm.log-->
<appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
<file value="folder/logfile" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="-yyyyMMdd-HHmm".log"" />
<StaticLogFileName value="false"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %p [%c] %m %n" />
</layout>
</appender>
<!--roll log files on a date period and within a date period on file size. For each day only the last 10 files of 1MB will be kept.-->
<appender name="RollingLogFileAppender3" type="log4net.Appender.RollingFileAppender">
<file value="logfile" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<datePattern value="yyyyMMdd" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="1MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--roll log files once per program execution.
The appendToFile property is set to false to prevent the appender from overwriting the existing files.
The maxSizeRollBackups is set to negative 1 to allow an infinite number of backup files.
The file size does have to be limited but here it is set to 50 Gigabytes which,
if a log file exceeds this size limit during a single run then it will also be rolled.-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logfile.txt" />
<appendToFile value="false" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="50GB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--logger-->
<logger name="myLog1">
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
</logger>
<logger name="myLog2">
<level value="DEBUG" />
<appender-ref ref="FileAppender1" />
</logger>
<root>
<level value="all" />
<!--<appender-ref ref="ConsoleAppender" />-->
<appender-ref ref="FileAppender1" />
</root>
</log4net>
</configuration>
<!--http://logging.apache.org/log4net/release/config-examples.html-->
<!--http://logging.apache.org/log4net/release/manual/configuration.html-->
<!--http://logging.apache.org/log4net/download.html-->
<!--
%c 列出logger名字空间的全称,如加上{<层数>}表示出从最内层算起的指定层数的名字空间
%X 按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。
%p 日志信息级别 如debug、warn或者info;
%d %d:输出日志时间点的日期或时间,可以在其后指定格式,比如:%d{yyyy-mm-dd hh:mm:ss},输出类似:2005-7-19 17:49:27,刚好适合插入sqlserver;
%C 日志信息所在地(全限类名)
%m 产生的日志具体信息
%n 输出日志信息换行 windows平台为“/r/n”,unix平台为“/n”
%F 显示调用logger的源文件名
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
%L 显示调用logger的代码行
%M 显示调用logger的方法名
%r 显示从程序启动时到记录该条日志时已经经过的毫秒数
%t 输出产生该日志事件的线程名
%d [%t] %p [%c] [line NO: %L] - %m %n
-->
// C# code:
/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using log4net.Config;
using System.IO;
using System.Reflection;
namespace log4Test
{
class Program
{
private static readonly ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // use root configure (set up the log name in root )
//private static readonly ILog log1 = LogManager.GetLogger("myLog1"); // use the logger name straight away.
//private static readonly ILog log2 = LogManager.GetLogger("myLog2"); // use the logger name straight away.
static void Main(string[] args)
{
//if (log.IsDebugEnabled )
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)); // declare the log4 file is current app.config file and monitor if it changes. // default 不写也行
//XmlConfigurator.ConfigureAndWatch(new FileInfo("path")); // declare The path to the configuration file
log.Debug("aaa");
Console.Read(); // for console appender
}
}
}