在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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM