在ASP.Net Core的项目中通过log4net添加日志记录到本地文件

===============================================

 2020/2/25_第1次修改                       ccb_warlock

 

===============================================

由于之前的时间都忙于项目的业务开发,对于log4net的使用一直是“拿来主义”,仅仅用在了调试时输出到控制台看结果,而没有深究配置文件的参数和具体的机制。

正巧这段时间项目进度没有那么紧张,我也有时间来完善框架内日志输出的部分,抱着“先易后难”的想法,我先不去实现向类似elasticsearch这样的日志系统去写日志,先从实现写入本地文件开始。

最初写winform的时候,隐约记得大都是通过数据流的方式向某个文件去写日志,其中还要考虑日志的文件是否存在、是否超过了大小、线程安全怎么做等等问题,在试验后发现log4net的功能封装的确实很简洁。

 


一、添加配置文件log4net.config

PS.当然配置文件可以不叫这个名字,为了方便我这里直接使用log4net.config

# 将下面的内容添加到log4net.config

<?xml version="1.0" encoding="utf-8"?>

<log4net>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger - %message %newline" />
        </layout>
    </appender>

    <appender name="DebugRollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="/var/tmp/log/myApp/debug/" />
        <appendToFile value="true" />
        <rollingStyle value="Composite" />
        <staticLogFileName value="false" />
        <datePattern value="yyyy-MM-dd'.txt'" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="1MB" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
    </appender>
    
    <appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="/var/tmp/log/myApp/error/" />
        <appendToFile value="true" />
        <rollingStyle value="Composite" />
        <staticLogFileName value="false" />
        <datePattern value="yyyy-MM-dd'.txt'" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="1MB" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="ERROR" />
            <param name="LevelMax" value="FATAL" />
        </filter>
    </appender>

    <root>
        <level value="ALL" />
        <appender-ref ref="ConsoleAppender" />
        <appender-ref ref="DebugRollingFileAppender" />
        <appender-ref ref="ErrorRollingFileAppender" />
    </root>
</log4net>

PS.写法(<file value="/var/tmp/log/myApp/debug/" />)等价于写法(<param name="File" value="/var/tmp/log/myApp/debug/" />

 

可以看到,DebugRollingFileAppender和ErrorRollingFileAppender就是为了实现写入本地文件而创建的配置,接着针对里面的参数项做详细的描述。

参数项 描述 值范围
file 日志文件所在的路径  
appendToFile 写入方式

true.增量写入

false.覆盖写入

rollingStyle 命名方式

Date.按照日期来命名

Size.按照文件大小来命名

Composite.综合日期和文件大小来命名

staticLogFileName 文件名是否可变

true.不可变(静态)

false.可变

datePattern 日期格式(用来控制滚动周期)。如果需要.txt后缀,可以在内容后面加上'.txt'。  
maxSizeRollBackups 滚动周期内的最大文件数 -1.表示无数量限制
maximumFileSize

每个文件的最大占用空间。

当该日志文件超过限定值后,如果滚动周期内的日志文件数小于最大文件数时,将会创建一个新的文件。如果等于最大文件数时,则会重新从滚动周期内的第1个文件重新开始写起

 
conversionPattern 每条日志的格式  
filter 过滤器(根据具体的类型设置来记录日志)  

 

接着单独拿出日志记录的格式来说明

<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
参数 描述 简写
%datetime 生成日志记录的时间 %d
%thread 生成日志记录的线程ID %t
%-5level 该日志的级别  
%logger 生成该日志的方法所在的类(包含程序集)  
%property 属性  
%message 日志的信息 %m
%newline 换行 %n
%L 该日志语句所在文件的行号  
%F 该日志语句所在的文件路径(包含文件名)  

level: 记录日志的最低级别,根据级别对应记录的日志如下:

 ALL    DEBUG   INFO    WARN    ERROR   FATAL   OFF
•All                        
•DEBUG  •DEBUG                  
•INFO   •INFO   •INFO               
•WARN   •WARN   •WARN   •WARN           
•ERROR  •ERROR  •ERROR  •ERROR  •ERROR      
•FATAL  •FATAL  •FATAL  •FATAL  •FATAL  •FATAL  
•OFF    •OFF    •OFF    •OFF    •OFF    •OFF    •OFF

二、在项目中添加log4net

我的项目是基于.net core 2.2创建的asp.net core项目,对于log4net的加入是在program.cs里实现的,具体的代码如下:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;

namespace Api
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        private static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureLogging((context, logging) =>
                {
                    logging.AddLog4Net();
                })
                .UseStartup<Startup>();
    }
}

接着后面的程序只要有log输出就会向指定的文件内写日志,例如我在定时任务中添加的日志输出:

using log4net;
using Quartz;

namespace Domain.Jobs
{
    public class ServiceToken : IJob
    {
        private readonly ILog _log = LogManager.GetLogger(typeof(ServiceToken));

        ······
        
        public Task Execute(IJobExecutionContext context)
        {
            var now = DateTimeOffset.Now;
            
            _log.Debug($"{now:yyyy/MM/dd HH:mm:ss.fff}, 执行维护token的任务.");

            // todo
            
            return Task.CompletedTask;
        }
    }
}

参考资料:

1.http://logging.apache.org/log4net/release/config-examples.html

2.https://stackoverflow.com/questions/8926409/log4net-hierarchy-and-logging-levels?r=SearchResults

 

 

 

原文地址:https://www.cnblogs.com/straycats/p/12359787.html