1.新建类库CSharpUtils
工具-》NuGet包管理器-》管理解决方案的NuGet程序包,输入log4net,安装
log4net.config文件
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
<file value=".\Log\Debug.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
<lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
<datePattern value="yyyyMMdd" />
<countDirection value="1"/>
<maxSizeRollBackups value="-1" />
<!--<maximumFileSize value="10MB" />-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date|%logger|%message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG" />
<levelMax value="DEBUG" />
</filter>
</appender>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<file value=".\Log\Error.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
<lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
<datePattern value="yyyyMMdd" />
<countDirection value="1"/>
<maxSizeRollBackups value="-1" />
<!--<maximumFileSize value="1MB" />-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date|%logger|%message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="ERROR" />
</filter>
</appender>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value=".\Log\Info.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
<lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
<datePattern value="yyyyMMdd" />
<countDirection value="1"/>
<maxSizeRollBackups value="-1" />
<!--<maximumFileSize value="1MB" />-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date|%logger|%message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
<levelMax value="INFO" />
</filter>
</appender>
<appender name="WarnAppender" type="log4net.Appender.RollingFileAppender">
<file value=".\Log\Warn.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
<lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
<datePattern value="yyyyMMdd" />
<countDirection value="1"/>
<maxSizeRollBackups value="-1" />
<!--<maximumFileSize value="1MB" />-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date|%logger|%message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="WARN" />
<levelMax value="WARN" />
</filter>
</appender>
<appender name="FatalAppender" type="log4net.Appender.RollingFileAppender">
<file value=".\Log\Fatal.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
<lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
<datePattern value="yyyyMMdd" />
<countDirection value="1"/>
<maxSizeRollBackups value="-1" />
<!--<maximumFileSize value="1MB" />-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date|%logger|%message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="FATAL" />
<levelMax value="FATAL" />
</filter>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="DebugAppender" />
<appender-ref ref="ErrorAppender" />
<appender-ref ref="InfoAppender" />
<appender-ref ref="WarnAppender" />
<appender-ref ref="FatalAppender" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
AssemblyInfo.cs文件
LogEvent.cs文件
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharpUtils.Log4netUtil
{
public interface ILogEventHandler
{
void LogEventHandler(LogEventArgs e);
}
public enum LogLevel
{
DEBUG, ERROR, WARN, INFO, FATAL
}
public sealed class LogEventArgs : EventArgs
{
private Exception ex = null;
private LogLevel level = LogLevel.DEBUG;
private Type type = null;
private String msg = String.Empty;
public LogEventArgs(Type type, LogLevel lvl, String msg, Exception ex)
{
this.level = lvl;
this.msg = msg;
this.type = type;
this.ex = ex;
}
public Type Type
{
get { return this.type; }
}
public Exception Ex
{
get { return this.ex; }
set { this.ex = value; }
}
public LogLevel Level
{
get { return this.level; }
}
public String Msg
{
get { return this.msg; }
set { this.msg = value; }
}
public override string ToString()
{
return this.type == null ? Msg : this.type.ToString() + ":" + Msg;
}
}
public delegate void LogEventHandler(LogEventArgs e);
}
Log4netWriter.cs文件
using System;
using System.Collections.Generic;
using System.Text;
using log4net;
namespace CSharpUtils.Log4netUtil
{
public class Log4netWriter
{
private static readonly Object m_lock = new object();
private static LogEventHandler formLogEventHandler = null;
private Log4netWriter()
{
}
public static void RegistFormLogEventHandler(LogEventHandler handler)
{
formLogEventHandler += handler;
}
public static void UnRegistFormLogEventHandler(LogEventHandler handler)
{
formLogEventHandler -= handler;
}
public static void WriteLog(LogEventArgs e)
{
InnerWriteLog(e);
if (formLogEventHandler != null)
{
formLogEventHandler.Invoke(e);
}
}
private static void InnerWriteLog(LogEventArgs e)
{
if (e == null)
return;
ILog logger = e.Type == null?LogManager.GetLogger(""):
LogManager.GetLogger(e.Type);
switch (e.Level)
{
case LogLevel.DEBUG:
default:
{
logger.Debug(e.Msg, e.Ex);
break;
}
case LogLevel.ERROR:
{
logger.Error(e.Msg, e.Ex);
break;
}
case LogLevel.INFO:
{
logger.Info(e.Msg, e.Ex);
break;
}
case LogLevel.WARN:
{
logger.Warn(e.Msg, e.Ex);
break;
}
case LogLevel.FATAL:
{
logger.Fatal(e.Msg, e.Ex);
break;
}
}
}
}
}
A项目调用时,在A下添加CSharpUtils项目引用,并放一份log4net.config
Log4netWriter.WriteLog(new LogEventArgs(typeof(Program),LogLevel.ERROR, "日志唉唉唉",ex));