一、前言

在上一篇文章【(转载)非常完善的Log4net配置详细说明
<https://www.cnblogs.com/snailblog/p/11484027.html>
】介绍了Log4Net的配置说明,如果不知道的可以去看看,这里我们就介绍一下日志记录的实现,说得都比较基础,所以大神请绕过。

二、Log4Net实现

前面介绍了了Log4Net的配置,这里我在把我用的额Log4Net 的配置信息展示出来
<log4net debug="false"> <root> <level value="ALL" /> </root> <logger name=
"PFTLog"> <level value="DEBUG"/> <appender-ref ref="ErrorRollingFileAppender" />
<appender-ref ref="DebugRollingFileAppender" /> <appender-ref ref=
"InfoRollingFileAppender" /> </logger> <!--数据日志--> <appender name=
"InfoRollingFileAppender" type="log4net.Appender.RollingFileAppender" > <file
value="LogFile\Info\" /> <appendToFile value="true" />
<!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type=
"log4net.Appender.FileAppender+MinimalLock" /> <Encoding value="UTF-8" />
<!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <MaxSizeRollBackups value="20"
/> <!--是否只写到一个文件中--> <StaticLogFileName value="false" />
<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value=
"Composite" /> <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]--> <!--这是按日期产生文件夹,并在文件名前也加上日期-->
<datePattern value="yyyyMMdd-"-Info.log"" /> <!--每个文件的大小。
只在混合方式与文件大小方式下使用。 超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。
不要使用小数,否则会一直写入当前日志--> <maximumFileSize value="1MB" /> <!--计数类型为1,2,3…-->
<!--<CountDirection value="1" />-->
<!--记录的格式。一般用log4net.Layout.PatternLayout布局--> <layout type=
"log4net.Layout.PatternLayout"> <conversionPattern value="%n记录时间:%date
%n线程ID[%thread] %n日志级别:%-5level %n记录类:%logger %n扩展信息:%property -%n异常:%exception
%n错误描述:%message%newline" /> </layout> <filter type=
"log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param
name="LevelMax" value="INFO" /> </filter> </appender> <!--错误日志--> <appender name
="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender" > <file
value="LogFile\Error\" /> <appendToFile value="true" />
<!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type=
"log4net.Appender.FileAppender+MinimalLock" /> <Encoding value="UTF-8" />
<!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <MaxSizeRollBackups value="20"
/> <!--是否只写到一个文件中--> <StaticLogFileName value="false" />
<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value=
"Composite" /> <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]--> <!--这是按日期产生文件夹,并在文件名前也加上日期-->
<datePattern value="yyyyMMdd"-Error.log"" /> <!--每个文件的大小。
只在混合方式与文件大小方式下使用。 超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。
不要使用小数,否则会一直写入当前日志--> <maximumFileSize value="1MB" /> <!--计数类型为1,2,3…-->
<!--<CountDirection value="1" />-->
<!--记录的格式。一般用log4net.Layout.PatternLayout布局--> <layout type=
"log4net.Layout.PatternLayout"> <conversionPattern value="%n记录时间:%date
%n线程ID[%thread] %n日志级别:%-5level %n记录类:%logger %n扩展信息:%property -%n异常:%exception
%n错误描述:%message%newline" /> </layout> <filter type=
"log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <
param name="LevelMax" value="ERROR" /> </filter> </appender> <!--调试日志--> <
appender name="DebugRollingFileAppender" type=
"log4net.Appender.RollingFileAppender" > <file value="LogFile\Debug\" /> <
appendToFile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <
lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <Encoding value
="UTF-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <
MaxSizeRollBackups value="20" /> <!--是否只写到一个文件中--> <StaticLogFileName value=
"false" /> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <
rollingStyle value="Composite" /> <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]-->
<!--这是按日期产生文件夹,并在文件名前也加上日期--> <datePattern value=
"yyyyMMdd"-Debug.log"" /> <!--每个文件的大小。 只在混合方式与文件大小方式下使用。
超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。 不要使用小数,否则会一直写入当前日志--> <
maximumFileSize value="1MB" /> <!--计数类型为1,2,3…--> <!--<CountDirection value="1"
/>--> <!--记录的格式。一般用log4net.Layout.PatternLayout布局--> <layout type=
"log4net.Layout.PatternLayout"> <conversionPattern value="%n记录时间:%date
%n线程ID[%thread] %n日志级别:%-5level %n记录类:%logger %n扩展信息:%property -%n异常:%exception
%n错误描述:%message%newline" /> </layout> <filter type=
"log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <
param name="LevelMax" value="DEBUG" /> </filter> </appender> </log4net> View
Code
里面配置了3个日志的等级(ERROR,DEBUG和INFO),根据日志的不同等级,记录到对应的文件里面。

下面是具体的实现代码
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config",
ConfigFileExtension = "config", Watch = true)] namespace PFT.Standard { public
class PFTLog { private static ILog log =
LogManager.GetLogger(Assembly.GetCallingAssembly(), "PFTLog"); public static
void Error(string message, Action RegistedProperties) { RegistedProperties();
log.Error(message); }public static void Error(string message, Exception
exception, Action RegistedProperties) { RegistedProperties();
log.Error(message, exception); }public static void Error(Exception exception,
Action RegistedProperties) { RegistedProperties(); log.Error("系统Error信息",
exception); }public static void Debug(string message, Action
RegistedProperties) { RegistedProperties(); log.Debug(message); }public static
void Debug(string message, Exception exception, Action RegistedProperties) {
RegistedProperties(); log.Debug(message, exception); }public static void
Debug(Exception exception, Action RegistedProperties) { RegistedProperties();
log.Debug("系统Debug信息", exception); } public static void Info(string message,
Action RegistedProperties) { RegistedProperties(); log.Info(message); }public
static void Info(string message, Exception exception, Action
RegistedProperties) { RegistedProperties(); log.Debug(message, exception); }
public static void Info(Exception exception, Action RegistedProperties) {
RegistedProperties(); log.Info("系统Info信息", exception); } } }
其中RegistedProperties注册扩展字段。

例如:C#代码
LogManager.Info("测试扩展字段", () => { LogicalThreadContext.Properties["LogType"]
= "扩展字段内容"; });
info日志文件为
<https://img2018.cnblogs.com/blog/1764554/201909/1764554-20190908094554944-160140577.png>


这样的字段扩展,可以保存到数据库,也可以与第三方传值字段对接,是不是很方便。

三、总结


Log4Net的基本实现,就先介绍到这里。本来计划把与Kibana结合也一起写了,结果发现Kibana结合到具体项目例子,才更方便讲解。所以接下来,我将开始介绍一些单个的模块实现,然后在基于这些模块,搭建一个简单的项目,然后在基于这个项目,写一些项目应用的文章。