我有一个安全工具,可以通过电子邮件向用户发送新密码。当阈值为VERBOSE时,生产电子邮件模块(我不拥有并且不想更改)将使用Log4Net记录整个html电子邮件正文。由于电子邮件包含明文形式的域用户密码,因此,我想在日志消息到达附加程序之前从日志消息中删除该密码。
有没有一种方法可以将对象临时插入Log4Net堆栈中,从而允许我搜索LoggingEvent消息并对其进行更改以掩盖我找到的所有密码?我想插入对象,调用电子邮件模块,然后删除对象。
我有文件appenders FileA,FileB和FileC.FileA我添加到根元素,因为我希望它是一个全部捕获,(更多内容见下文).FileB和FileC我用于特定的消息,并为每个appender创建命名记录器.在代码中,我加载了我用于大多数消息的日志,如下所示:
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Run Code Online (Sandbox Code Playgroud)
其他记录器,我这样加载
private static readonly log4net.ILog commandLog = log4net.LogManager.GetLogger("LoggerFileB");
Run Code Online (Sandbox Code Playgroud)
发生的事情是我得到了我对LoggerFileB的期望,即只有特殊的消息.问题是这些消息也出现在LoggerFileA中,这是我添加到root的全部.我可以为catch-all创建一个特定的命名实例,而不是将其添加到根元素,但我希望调用类型作为输出中的记录器名称.创建命名记录器意味着%logger输出日志的名称而不是类型.有没有办法准确地得到我想要的东西(显示记录器名称作为类型,但不显示记录到其他命名记录器的消息)?希望我错过了一些东西,并且有一个简单的解决方案.
这是我的log.config在这种情况下的样子.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<appender name="FileA" type="log4net.Appender.RollingFileAppender">
<file value="FileA.txt" />
...snip...
</appender>
<appender name="FileB" type="log4net.Appender.RollingFileAppender">
<file value="FileB.txt" />
...snip...
</appender>
<appender name="FileC" type="log4net.Appender.RollingFileAppender">
<file value="FileC.txt" />
...snip...
</appender>
<root>
<level value="ALL" />
<appender-ref ref="LoggerFileA" />
</root>
<logger name="LoggerFileB">
<level value="ALL" />
<appender-ref ref="FileB" />
</logger>
<logger name="LoggerFileC">
<level value="ALL" />
<appender-ref ref="FileC" />
</logger>
</log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud) 我开发了一个asp.net网站,我使用log4net以格式记录错误信息:
"%-5p %d - %m%n"
Run Code Online (Sandbox Code Playgroud)
它按当前机器的日期时间记录日期时间.例如:
FATAL 2011-04-10 01:08:11,759 - message
Run Code Online (Sandbox Code Playgroud)
但是我想将datetime转换为另一个区域或者用它来增加额外的时间.例如,我想在上一个示例中添加3个小时,并希望输出为:
FATAL 2011-04-10 **04**:08:11,759 - message
Run Code Online (Sandbox Code Playgroud)
有关如何实现这一点的任何想法?
我是一个Log4Net新手,试图基本/安全地了解它是如何工作的.如果我将Logger配置为FileAppender,并且我有多个语句,如下所示,一个接一个:
this.GetLogger().Info("...");
this.GetLogger().Error("....");
Run Code Online (Sandbox Code Playgroud)
每个调用是否实际打开文件,写入字符串并关闭它?每次?或者还有其他什么吗?我想知道何时使用文件资源.它是如何工作的?
我有一个奇怪的问题,我的log4net设置没有记录任何数据到数据库,也没有引发任何异常来通知问题.我已在一个名为"Log4net.Config"的单独文件中定义了配置设置,并在程序集中引用了它.(请注意,我通过nuget lib安装了Log4net lib)
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
Run Code Online (Sandbox Code Playgroud)
这是日志文件.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=(local);Initial Catalog=testdb;Integrated Security=True" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<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"> …Run Code Online (Sandbox Code Playgroud) 我想在运行时更改我的日志名称而不更改附加程序。基本上,一旦到了一天中的某个设定时间,我希望能够使用不同的文件。
这是我的 appender 的样子:
<appender name="info" type="log4net.Appender.RollingFileAppender">
<file value="logs\" />
<datePattern value="yyyyMMdd'_INFO.log'" />
<staticLogFileName value="false" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline[%date]-%level-%logger[%M]- Linea:%L - %message%newline"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO"/>
<param name="LevelMax" value="INFO"/>
</filter>
</appender>
Run Code Online (Sandbox Code Playgroud)
这是我遍历 appender 的函数:
public void SetLogFile(string fileName)
{
foreach (var appender in log.Logger.Repository.GetAppenders())
{
try
{
((log4net.Appender.FileAppender)appender).File = fileName;
((log4net.Appender.FileAppender)appender).ActivateOptions();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
SetLogFile("log1.txt");
Run Code Online (Sandbox Code Playgroud)
它为此特定示例创建以下文件:
log1.txt20171221_INFO.log
我希望我的日志文件被命名,log1.txt …
我有一个使用我的一些库的 UWP 应用程序。此类库使用 log4net 进行日志记录,并在多个项目中共享,而不仅仅是 UWP。
我想通过 XML 配置文件中的常用 confi 部分配置 log4net,但我找不到在 UWP 项目中执行此操作的方法,因为没有 app.config 文件。
我应该把下面的部分放在哪里?
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date - %message%newline" />
</layout>
</appender>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="log\mylog.log" />
<appendToFile value="true" />
<maximumFileSize value="2000KB" />
<maxSizeRollBackups value="20" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="Console" />
<appender-ref ref="RollingFile" />
</root>
</log4net>
Run Code Online (Sandbox Code Playgroud)
谢谢!
我将log4net在我的wpf申请中使用.我需要在我的日志中的消息如下所示:
11/8/2018 10:49:38 AM 13 (5368) properties disabled.
Run Code Online (Sandbox Code Playgroud)
其中13是processId其中写入该消息.所以这很容易.但不幸的是我无法做到这一点.所以我只需要一个适合我的log4net记录器的模式布局.
我在官方网站的faq部分找到了以下消息log4net:
以下示例
FileAppender通过%processid在File属性中指定模式来设置a的文件名以包括当前进程ID .
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file type="log4net.Util.PatternString" value="log-file-[%processid].txt" />
<layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" />
</appender>
Run Code Online (Sandbox Code Playgroud)
所以,它的工作原理,但仅适用于我的日志文件中的文件名而不是布局.我需要把它%processid放到我的布局中.我目前的布局是:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{dd/MM/yyyy HH:mm:ss,fff tt} %processid (%thread) - %message%newline" />
</layout>
Run Code Online (Sandbox Code Playgroud)
我的日志只是将processid字符串写入我的日志文件.
22/11/2018 16:21:51,863 PM processid (1) - Exiting application.
Run Code Online (Sandbox Code Playgroud)
我也找到了答案.它有效.但是%processid在启动期间,属性仅初始化一次.在我的应用程序中,编写程序通常会发生变化 …
我今天开始玩log4net,到目前为止,我真的很喜欢它.为了保留我们当前的日志记录功能,应用程序需要在应用程序启动时创建新的日志文件.日志文件名具有编码在其中的日期和时间戳.目前,我已经通过一个配置了log4net XmlConfigurator,这很好用,除了我的文件名RollingFileAppender在配置XML文件中是硬编码的.
我想继续使用XmlConfigurator,但是在调用之后Configure(),我希望得到RollingFileAppender和,在代码中,将其文件值更改为动态生成的字符串.网上的示例文档现在似乎已经关闭了,但是我已经深入研究了SDK参考,看起来我可以使用Heirarchy和GetAppenders()做我需要做的事情.我是在正确的轨道上吗?
好的,我对此进行了尝试并尝试了以下代码,但这些代码无效:
private static readonly ILog _log = LogManager.GetLogger(typeof(GUI));
// in the config file, I've set the filename to example.log, and it works
XmlConfigurator.Configure(new FileInfo("log_config.xml"));
Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
if(hierarchy != null) {
// get the appenders
IAppender[] appenders = hierarchy.GetAppenders();
// change the filename for the RollingFileAppender
foreach( IAppender a in appenders) {
RollingFileAppender rfa = a as …Run Code Online (Sandbox Code Playgroud) 第一次玩Log4Net,我遇到了麻烦.我已经按照各种教程进行了操作,但我无法将其记录下来.让我告诉你我的代码,希望你能告诉我我做错了什么.
的app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="CurrentLog.txt"/>
<staticLogFileName value="true"/>
<appendToFile value="true"/>
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd"/>
<filter type="log4net.Filter.LevelRangeFilter">
<acceptOnMatch value="true" />
<levelMin value="DEBUG" />
<levelMax value="FATAL" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{dd MMM yyy HH:mm:ss} %level %message. %newline %exception" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)
AssemblyInfo.cs中
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
Run Code Online (Sandbox Code Playgroud)
Presenter.cs
在课程的顶部我有这个:
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Run Code Online (Sandbox Code Playgroud)
然后我尝试在类的后面使用log变量:
bool isDebugEnabled …Run Code Online (Sandbox Code Playgroud)