我遇到的问题与大多数人使用 Log4net 时遇到的问题相反。我有一个基本的滚动日志附加程序,我在后面的代码中使用 INFO、WARN 和 ERROR 级别。我已在 app.config 中关闭调试。除了滚动日志附加程序之外,它仍然将日志数据推送到控制台窗口。
我该如何阻止这种行为?这使得查看控制台窗口成为一场噩梦。
我的配置:
<log4net debug="false">
<appender name="RollingFileAppender"
type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString"
value="milliondollars.log"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<rollingStyle value="Composite"/>
<filter type="log4net.Filter.LevelRangeFilter">
<acceptOnMatch value="true" />
<levelMin value="INFO" />
<levelMax value="FATAL" />
</filter>
<datePattern value="yyyyMMdd"/>
<maxSizeRollBackups value="100"/>
<maximumFileSize value="15MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger: %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
Run Code Online (Sandbox Code Playgroud) 我一直在努力让 log4net 与 PowerShell 一起工作。我有以下 PowerShell 代码,它使用配置文件拉入 log4net,然后尝试创建一个简单的日志文件条目,但出现错误。
Clear-History
Clear-Host
#
Write-Host "BEGIN: Importing module psm_logger.psm1"
Import-Module "C:\Users\Administrator\Desktop\ps\IIS\psm_logger.psm1" -Force
Write-Host "BEGIN: log4net configuration definition"
$log = New-Logger -Configuration "C:\Users\Administrator\Desktop\ps\IIS\logging\log4net.config" -Dll "C:\Users\Administrator\Desktop\ps\IIS\logging\log4net.dll"
Write-Host "END: log4net configuration definition"
Write-Host "BEGIN: log4net configuration DEBUG definition"
#$log.DebugFormat("Logger configuration file is : '{0}'", (Resolve-Path "C:\Users\Administrator\Desktop\ps\IIS\logging\log4net.config"))
Write-Host "END: log4net DEBUG configuration definition"
#======================
$ThisHostname = $env:COMPUTERNAME
#======================
Write-Host "BEGIN: Module/Snapin import/addition"
Write-Host ""
$log.Info("BEGIN: Module/Snapin import/addition")
#======================
Run Code Online (Sandbox Code Playgroud)
上面引用的 psm_logger.psm1 文件包含:
function New-Logger
{
#Write-Host "BEGIN: New-Logger" …Run Code Online (Sandbox Code Playgroud) 使用共享程序集时如何配置 log4net?
我有多个依赖于公共组件的组件。每个组件都位于其自己的组件中。所有组件都使用 log4net 进行日志记录。所有组件都加载到单个进程空间中,但组件的使用顺序各不相同。所有外向组件在首次使用时加载各自的 log4net 配置,以尝试将日志数据发送到它们。通用组件不加载任何配置。此外,还有一个不使用公共组件的遗留组件。它还在首次使用时暴露并加载其配置。我无法直接接触这个遗留组件的代码或配置。
我面临的问题是,由于组件在第一次使用时加载其配置,最后一个加载配置的人获胜。这会导致发生日志记录,但所有日志输出最终都会进入加载的最后一个配置。显然,查看日志文件并将其他组件的日志条目写入其中是很丑陋的。
我通过使用 RepositoryAttribute 和 AliasRepositoryAttribute 找到了部分解决方案。这让外部组件将它们的配置加载到它们的“记录器存储库”中,并有效地将它们彼此隔离。遗留组件现在可以愉快地写入自己的日志,而我的组件没有噪音,我的组件也可以愉快地写入自己的日志,而不会在其他日志中产生噪音。
我说部分解决方案是因为仍然存在公共组件的日志记录情况。使用 AliasRepositoryAttribute 时,加载并为公共组件设置别名的第一个组件会获取所有日志输出,即使它是另一个正在调用公共组件的组件。这很糟糕,因为我会在后面的组件中丢失重要的日志信息,而且我会在第一个日志中包含不相关的日志信息。
下面的代码演示了这个问题:
通用:(代表通用组件)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using log4net.Config;
[assembly: Repository("CommonLib")]
namespace CommonLib
{
public class CommonClass
{
static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public void DoCommon(string from)
{
Log.Debug("DoCommon:" + from);
}
}
}
Run Code Online (Sandbox Code Playgroud)
库 A:(代表其中一个外向组件)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using CommonLib;
using log4net;
using log4net.Config;
[assembly: Repository("ALib")]
[assembly: AliasRepository("CommonLib")]
namespace ALib …Run Code Online (Sandbox Code Playgroud) this is my log4net configuration, the rollover log file is created wrong extension. The first file created with name of log_debug.txt and the rollover file created with log_debug.txt.1. but ideally it should be log_debug.1.txt.
I used preserveLogFileNameExtension value to be true, but it seems not working. Can you please check and let me know if anything wrong?
<appender name="DebugRollingFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG" />
<levelMax value="DEBUG" />
</filter>
<file value=".\logs\log_debug.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="20" …Run Code Online (Sandbox Code Playgroud)我不敢相信我不得不问这个,但这里是......
我正在尝试在新的 WPF 应用程序中设置 log4net,但出于某种原因,它没有创建日志文件并记录任何内容,所以这是我到目前为止所做的步骤......
从 nuget 添加最新版本 (v2.0.8.0) 参考后。
在 AssemblyInfo.cs 中:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
Run Code Online (Sandbox Code Playgroud)
在 app.config 中:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />
</configSections>
<log4net configSource="Log4Net.config" />
Run Code Online (Sandbox Code Playgroud)
在 Log4Net.config 中:
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="rollingLogFile" type="log4net.Appender.RollingFileAppender">
<file value="D:\Logs\WorkflowApp.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-6level %logger - %message %exception%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" /> …Run Code Online (Sandbox Code Playgroud) 我在我的C#应用程序中收到此错误.我使用log4net作为日志记录工具.
这是我的app.config文件:
<configuration>
<configSections>
<section name="log4net" type ="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="myLogger" />
</root>
<appender name="myLogger" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="C:\MyApp\Logs\appLog.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="2" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<datePattern value="yyyyMMdd" />
<lockingModel value="log4net.Appender.FileAppender+MinimalLock" />
<immediateFlush value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
今天早些时候我问了一个关于从代码配置log4net的问题,并且很快得到了答案,这使我可以将其配置为输出到文本文件.从那以后我的需求发生了变化,我需要使用SqLite作为追加器.所以我创建了以下类来允许这个:
public static class SqLiteAppender
{
public static IAppender GetSqliteAppender(string dbFilename)
{
var dbFile = new FileInfo(dbFilename);
if (!dbFile.Exists)
{
CreateLogDb(dbFile);
}
var appender = new AdoNetAppender
{
ConnectionType = "System.Data.SQLite.SQLiteConnection, System.Data.SQLite",
ConnectionString = String.Format("Data Source={0};Version=3;", dbFilename),
CommandText = "INSERT INTO Log (Date, Level, Logger, Message) VALUES (@Date, @Level, @Logger, @Message)"
};
appender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@Date",
DbType = DbType.DateTime,
Layout = new log4net.Layout.RawTimeStampLayout()
});
appender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@Level",
DbType = DbType.String,
Layout = new log4net.Layout.RawPropertyLayout { …Run Code Online (Sandbox Code Playgroud) 可以在不重新启动ASP.NET应用程序的情况下更改log4net日志记录级别.配置log4net配置的一些可能方法是:
[assembly:log4net.Config.XmlConfigurator(ConfigFile="Log4Net.config",Watch=true)]更改web.config文件中的配置将重新启动应用程序.如果我不想重新启动应用程序,是否建议使用单独的配置文件,或者是否有任何不同的方法?
我有一个小测试项目,代码如下:
class Program
{
static void Main(string[] args)
{
log4net.GlobalContext.Properties["logFileName"] = "log.txt";
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.xml"));
log4net.ILog logger = log4net.LogManager.GetLogger("Tests");
logger.Debug("Test message");
}
}
Run Code Online (Sandbox Code Playgroud)
我的log4net.xml配置文件包含以下内容:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="%property{logFileName}" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%utcdate{ISO8601} [%level][%logger] %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么log4net创建名为%property {logFileName}的文件并且不用log.txt替换它?
log4net库取自NuGet(Id:log4net Version:2.0.3).
我在解决方案中有其他类库的WCF项目.我使用nuget包管理器为需要记录的项目添加了Common.Logging.
我收到此错误:
无法创建类型'Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter,Common.Logging.Log4Net'
当我执行时:
Common.Logging.ILog logger = Common.Logging.LogManager.GetLogger<Service1>();
logger.Error("Test");
Run Code Online (Sandbox Code Playgroud)
我的Web.Config就在这里
编辑:Bin文件夹有Common.Logging.Log4net1213.dll以及log4net.dll
