为.Net Core 3.1应用程序配置log4net的最简单正确方法

jjjwad0x  于 12个月前  发布在  .NET
关注(0)|答案(5)|浏览(138)

我正在努力理解在.Net Core 3.1应用程序中配置log 4 net的最简单方法。该应用程序使用log 4 net 2.0.8。所以:
有没有一种方法可以使用application.runtimeconfig.json文件进行配置?如果有,我会向应用程序添加什么代码来告诉它使用这些设置-类似于:

log4net.Config.XmlConfigurator.Configure();

字符串
如果这是不可能的,那么添加配置文件(比如log4net.xml)并告诉应用程序使用它的最简单方法是什么?
目前我想把所有的日志都指向一个文件,比如Temp.log。我看了很多log 4 net页面,但是他们要么讨论使用Assembly.Info.cs,这在新的.Net Core 3.1项目中不存在,要么似乎以编程方式设置log 4 net配置,这是我想避免的。我希望这很容易,所以如果我错过了一个明显的方法,我道歉。

gorkyyrv

gorkyyrv1#

编辑我的回答一点,以明确核心不包括一个正常的文件记录器开箱即用.我的错.(截至5/19/2020)
我建议使用来自Microsoft的日志扩展而不是log 4 net,但这应该适合你。Core现在附带了一个日志记录器,它非常好,易于插入DI,并使用appsettings.json。如果你需要,我也可以提供一个示例。但这里是log 4 net基本示例。
从文件加载配置的示例控制台应用程序(文件设置为始终复制)

using log4net.Repository;
using System;
using System.IO;
using System.Reflection;

namespace ConsoleApp1Core
{
    class Program
    {
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        static void Main(string[] args)
        {
            try
            {

                ILoggerRepository repository = log4net.LogManager.GetRepository(Assembly.GetCallingAssembly());

                var fileInfo = new FileInfo(@"log4net.config");

                log4net.Config.XmlConfigurator.Configure(repository, fileInfo);

                log.Info("test");

                Console.WriteLine("press any key");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine("Press any key to exit");
                Console.ReadLine();
            }
        }
    }
}

字符串

kyvafyod

kyvafyod2#

我能够用以下方法回应:

1-Install-Package log4net
2-Install-Package MicroKnights.Log4NetAdoNetAppender
3-Install-Package System.Data.SqlClient

首先,我已经创建了一个数据库和表与此代码:

CREATE DATABSE Log4netDb
CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (1, 1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)


第二,我在程序中创建了log4net.config文件。这是一个简单的配置,没有对日志消息进行自定义:

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
  <!-- definition of the RollingLogFileAppender goes here -->
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Logs/WebApp.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <!-- Format is [date/time] [log level] [thread] message-->
      <conversionPattern value="[%date] [%level] [%thread] %m%n" />
    </layout>
  </appender>
  <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />
    <connectionStringName value="log4net" />
    <connectionStringFile value="appsettings.json" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@thread" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%thread" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@exception" />
      <dbType value="String" />
      <size value="2000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="RollingLogFileAppender" />
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>


第三,我将下面的代码替换为IHostBuilder

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureLogging(logging =>
    {
        // clear default logging providers
        logging.ClearProviders();
        logging.AddConsole();  
        logging.AddDebug();
        logging.AddEventLog();
        // add more providers here
    })
    .UseStartup<Startup>();


第四,在appsettings.json中我插入了以下代码:

{
  "connectionStrings": {
    "log4net": "Server=MICKO-PC;Database=Log4netDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}


最后,我使用了这些命令来享受登录的乐趣

public class ValuesController : Controller
{
    private static readonly ILog log = LogManager.GetLogger(typeof(ValuesController));
    
    [HttpPost]
    public async Task<IActionResult> Login(string userName, string password)
    {
        log.Info("Action start");
        
        // More code here ...
        log.Info("Action end");
    }
    
    // More code here...
}


祝你好运

fcy6dtqo

fcy6dtqo3#

使用Microsoft.Extensions.Logging.Log4Net.AspNetCore很容易配置。
参考:https://github.com/huorswords/Microsoft.Extensions.Logging.Log4Net.AspNetCore

9vw9lbht

9vw9lbht4#

对我来说,唯一起作用的是安装额外的Nuget包:

Serilog.Extensions.Logging.File

字符串
当然包括Microsoft.Extensions.Logging.Log4Net.AspNetCore

1szpjjfi

1szpjjfi5#

CREATE DATABASE Log4netDb应为CREATE DATABASE Log4netDb

相关问题