标签: nlog

如何在包装NLog时保留呼叫站点信息

我有一个包装NLog的类(称为NLogger).我的日志保存到我的数据库中.我遇到问题的是如何显示日志记录发生的位置.我有这个

<parameter name="@Logger" layout="${callsite}"/>  
Run Code Online (Sandbox Code Playgroud)

但这只是显示Core.Logging.Loggers.NLogLogger.Log这是我的NlogWrapper而不是调用我的包装器的类.

这是我的包装方法

        public void Log(LogType messageType, Type context, string message, Exception exception)
        {
            NLog.Logger logger = NLog.LogManager.GetLogger(context.Name);
            LogLevel logLevel = LogLevel.Info; // Default level to info

            switch (messageType)
            {
                case LogType.Debug:
                    logLevel = LogLevel.Debug;
                    break;
                case LogType.Info:
                    logLevel = LogLevel.Info;
                    break;
                case LogType.Warning:
                    logLevel = LogLevel.Warn;
                    break;
                case LogType.Error:
                    logLevel = LogLevel.Error;
                    break;
                case LogType.Fatal:
                    logLevel = LogLevel.Fatal;
                    break;
                default:
                    throw new ArgumentException("Log message type is not supported");                    
            }

            logger.Log(logLevel, message, exception);
        }
Run Code Online (Sandbox Code Playgroud)

c# logging nlog

31
推荐指数
2
解决办法
2万
查看次数

NLog不会创建日志文件

我正在尝试将日志记录添加到使用Windows Mobile 6.1在移动设备上运行的应用程序. .NETCompact框架3.5.使用NLog.

我安装了适当版本的NLog发行版​​.

但是,没有创建日志文件.

这是我的NLog.config档案:

<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target name="logfile" xsi:type="File" fileName=".\Neolant.ASRM.Terminal.log" layout="${longdate}|${level}|${message}|${exception}" autoFlush="true"/>
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile" />
  </rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)

这是我使用的测试代码:

public static void Main()
{
    try
    {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
        var logger = NLog.LogManager.GetLogger("UpperLevel");
        logger.Info("test test test.");
        try
        {
            throw new Exception("Unexpected!");
        }
        catch (Exception e)
        {
            var logger = NLog.LogManager.GetLogger("UpperLevel");
            logger.WarnException("An exception occured.", e);
        }
        throw new Exception("Suddenly!");           
    }
    finally
    {
        NLog.LogManager.Flush();
    }
}

private static void …
Run Code Online (Sandbox Code Playgroud)

c# compact-framework nlog

31
推荐指数
6
解决办法
5万
查看次数

在NLog中运行时添加/删除日志文件

我正在写一个小文件转换实用程序.文件在放入目录时会自动转换.

我正在使用NLog进行日志记录.除了使用NLog.conf配置的中央日志文件(并接收生成的所有消息)之外,我还想为每个输入文件创建一个额外的日志文件,它具有相似的名称并包含在转换过程中写入的所有日志消息.

不幸的是,我似乎无法在运行时找到如何正确添加新文件目标和相应规则.我希望Logger在转换过程中所有对象都写入新的日志文件.

我试过类似的东西

var logfile = new NLog.Targets.FileTarget();
logfile.FileName = fileName + ".log";
logfile.KeepFileOpen = true;
logfile.Initialize();
var rule = new NLog.Config.LoggingRule("*", logfile);
NLog.LogManager.Configuration.LoggingRules.Add(rule);
NLog.LogManager.ReconfigExistingLoggers();
//
// Proceed with converting file
//
logfile.Flush();
NLog.LogManager.Configuration.LoggingRules.Remove(rule);
NLog.LogManager.ReconfigExistingLoggers();
Run Code Online (Sandbox Code Playgroud)

但是没有创建日志文件.

我错了什么?任何的想法?

.net c# logging nlog

29
推荐指数
1
解决办法
1万
查看次数

29
推荐指数
3
解决办法
3万
查看次数

log4net.ThreadContext和log4net.LogicalThreadContext有什么区别?

更新于2014年11月18日 - 在浏览log4net源存储库时,我发现LogicalThreadContext的实现在2011年11月被修改为使用CallContext.LogicalSetData存储其属性(并使用LogicalGetData获取它们).这很重要,因为这意味着LogicalThreadContext现在应该可以正常工作.存储在LogicalThreadContext中的任何数据都应"流向"任何子线程或任务.这与ThreadContext(以及LogicalThreadContext的旧实现)相比较,其中存储在上下文中的数据将保持在当前线程的本地,而不是流向子线程/任务.

如果您有兴趣,可以参考以下内容:

http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs?r1=1165341&r2=1207948&diff_format=h

希望有人发现这个老问题会发现这些信息很有用.

log4net提供了两个不同的"线程上下文"对象:ThreadContextLogicalThreadContext,每个对象 都有一个属性包.ThreadContext有一个ThreadContextProperties包,而LogicalThreadContext有一个LogicalThreadContextProperties包.

ThreadContext可能更常被称为"MDC".LogicalContext可能更常被称为"LDC".我会在这篇文章的其余部分使用短名称.

MDC.Properties使用System.Threading.Thread.SetData实现,而LDC.Properties使用System.Runtime.Remoting.Messaging.CallContext.SetData实现.

为了进行比较,NLog仅公开"MDC"(现在称为MappedDiagnosticContext)来存储线程本地属性.NLog的实现使用System.Threading.Thread.SetData,因此它的实现与log4net相同.

在log4net和NLog中,"MDC"属性存储在字典中,该字典本身存储在线程本地存储中.

在这样的情况下,将字典存储在用[ThreadStatic]装饰的类成员变量中是否相同?

[ThreadStatic]
private static IDictionary<string, string> threadProperties;
Run Code Online (Sandbox Code Playgroud)

什么是使用.NET 4.0的新ThreadLocal类的等效(或类似)声明?

最终,LDC和MDC之间真正的,实际的差异是什么?即使在阅读了上面链接的MSDN主题之后,我也不清楚.你什么时候真的使用一个而不是另一个?似乎我在log4net和上下文中看到的绝大多数引用/示例都是针对GDC(全局 - 我理解),NDC(嵌套 - 我也理解)和MDC.我在google搜索时可以找到LDC(或LogicalThreadContext)的大多数引用都与登录到log4net源代码库有关,而不是真实世界的用法.最不发达国家几乎从未提出问题或例子.

我确实找到了这个链接,提供了一些关于与log4net开发人员之一Nicko Cadell的差异的非常好的信息,但我仍然不清楚.

一个更大的问题,与log4net没有直接关系的是Thread.SetData和CallContext.SetData之间的实际区别是什么?

根据CallContext MSDN文章,CallContext数据可以传播到另一个AppDomain.要传播,存储在CallContext中的数据项必须公开ILogicalThreadAffinative接口.所以,这似乎是Thread.SetData和CallContext之间的一个区别.

根据Nicko Cadell链接,log4net不实现ILogicalThreadAffinative,因此不会传播LDC属性.

也许这里有足够的东西我应该能够回答我自己的问题,也许不是.我还在努力理解.

如果你使用log4net,你们每个人都使用MDC,LDC吗?如果你使用MDC,是因为大多数"真实世界"的例子似乎都在使用它吗?如果你使用LDC,你有特定的理由使用它吗?如果你同时使用它们,你如何选择何时使用哪个?

请注意,我已经看到一些关于MDC(也许是LDC)的文章可能因为线程切换而无法在ASP.net应用程序中正常工作.我对这个问题不是特别感兴趣,因为我不在ASP.net工作.

实际上,我在SO上发现了一些可能有助于讨论的有用帖子:

在.NET中使用线程本地存储的最佳实践是什么?

.Net:逻辑线程和线程本地存储?

提前致谢!

.net logging log4net nlog thread-local-storage

28
推荐指数
1
解决办法
1万
查看次数

NLog旋转和清理日志文件

我公司内部正在与NLog合作.我们遇到了大量日志文件的问题.我们想要做的是按天归档文件并保留最多x个文件.让我们说7.我已经在互联网上阅读了几个关于此的主题,他们主要指向我修改我的NLog.config文件的方向.但是,它似乎不愿意像我期望的那样旋转文件.目前,所需的文件夹中没有任何内容存档.但是所有文件都以以下格式保存在'logs'-directory中;

Log.info.2011-11-07.txt
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我有一个目录'logs'.在该文件夹中保存所有日志文件.我还有一个名为'archives'的文件夹,我想在其中存档所有旧文件.在该目录中达到最大数量的日志文件后,应自动清除它们.这可能吗?我当前的NLog.config文件如下所示;

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwExceptions="true"
      internalLogFile="C:\nlog-internal.txt"
      internalLogLevel="Error">

  <extensions>
    <add assembly="NLog.Extended" />
  </extensions>

  <targets>
    <!-- will move file to archive once it reaches 1MB. Files are archived by day, with a maximum of three files. ConcurrentWrites is set to false, 
            change to true if multiple processes will be writing to the logfile-->
    <target name="file" xsi:type="File" fileName="${basedir}/logs/Log.info.${shortdate}.txt" 
            layout="${longdate} ${callsite} ${level}: ${message} ${exception:format=Message,StackTrace} ${stacktrace}"
            archiveFileName="${basedir}/logs/archives/log.info.${shortdate}.txt"
            archiveAboveSize="1048576"
            archiveEvery="Day"
            archiveNumbering = "Rolling"
            maxArchiveFiles="7"
            concurrentWrites="false"
            />
    <target name="file-default" xsi:type="File" …
Run Code Online (Sandbox Code Playgroud)

error-handling logging nlog

28
推荐指数
2
解决办法
2万
查看次数

使用Nlog登录多个文件

我正在使用NLog进行日志记录.

我的代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <!-- make sure to set 'Copy To Output Directory' option for this file -->
  <!-- go to http://nlog-project.org/wiki/Configuration_file for more information -->

  <targets>
    <target
      name="logfile"
      xsi:type="File"
      layout="${message}"
      fileName="${basedir}../Data/debugLog1.txt"
      archiveAboveSize ="5000000"
      maxArchiveFiles="2"/>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="logfile" />
  </rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)

我正在记录数据debugLog1.txt.现在从项目的另一个位置我也想记录数据,但这个数据是另一种类型,所以我想制作一个debugLog2.txt并记录数据.如何修改上面的代码来执行此操作

c# nlog winforms

28
推荐指数
3
解决办法
2万
查看次数

在ASP.NET Core应用程序中使用NLog

我找到了一个CodeProject,其中有一个如何使其工作的示例,但它不起作用.主要问题似乎是"Microsoft.Framework.Logging.NLog": "1.0.0-*"Nuget中似乎不存在包.我查看了这个StackOverflow问题并查看了它引用的GitHub示例,但它似乎包含相同的问题.

我试图让它自己工作,我提出的最好的是以下内容:

public class NLogLogger : ILogger
{
    public NLogLogger()
    {
        new WebLoggerConfigurer().ConfigureDefault();
    }

    public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
    {
        // currently need the global:: for LogLevels because our namespace contains NLog in it. Is there a better naming convention we could use instead?
        var ll = logLevel == LogLevel.Debug ? global::NLog.LogLevel.Debug
                : logLevel == LogLevel.Verbose ? global::NLog.LogLevel.Trace
                : logLevel == LogLevel.Critical ? global::NLog.LogLevel.Fatal …
Run Code Online (Sandbox Code Playgroud)

nlog asp.net-core ms-extensions-logging

28
推荐指数
3
解决办法
3万
查看次数

Nlog没有创建相对于网站项目的文件

我正在使用一个网站项目,我从Nuget添加了Nlog,并使用了以下NLog配置:

<?xml version="1.0" encoding="utf-8" ?>
<nlog autoReload="true" 
      throwExceptions="true" 
      xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
        <target name="logfile" xsi:type="File" fileName="log.txt" />
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="logfile" />
    </rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)

我运行了ProcessMonitor,它显示Nlog正在尝试在IISExpress文件夹而不是我的网站项目文件夹中创建log.txt.

C:\ Program Files(x86)\ IIS Express\log.txt

如何让NLog将我的日志文件log.txt放在我的网站项目文件夹而不是IISExpress文件夹中?

asp.net webforms nlog

27
推荐指数
1
解决办法
8254
查看次数

使用C#,只使用NLog和控制台应用程序发送一封包含所有错误的电子邮件

我只想发送一封电子邮件,其中包含我从C#控制台应用程序获得的所有错误.

我有目标:

<target xsi:type="File" name="HeelpAdsImport_log" fileName="${basedir}/logs/HeelpAdsImport-${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${callsite:className=true:includeSourcePath=true:methodName=true} ${message}" />

<target name="HeelpAdsImport_patrick_email" xsi:type="Mail"
        smtpServer="XXXXX"
        smtpPort="25"
        smtpAuthentication="Basic"
        smtpUserName="YYYYYY"
        smtpPassword="*ZZZZZZ"
        enableSsl="false"
        from="DDDDDDDDDD"
        to="EEEEEEEEEEE"
        layout="${longdate} ${uppercase:${level}} ${callsite:className=true:includeSourcePath=true:methodName=true} ${message}"
      />
Run Code Online (Sandbox Code Playgroud)

我有一个信息规则和一个错误规则:

<logger name="*" minlevel="Info" writeTo="HeelpAdsImport_log" />

<logger name="*" minlevel="Error" writeTo="HeelpAdsImport_patrick_email" />
Run Code Online (Sandbox Code Playgroud)

我在代码中有几个调用:

logger.Log(LogLevel.Info, " ----- New Ad Success! - auto.id: " + auto.id + " | auto.plate: " + auto.plate);

logger.Log(LogLevel.Error, "| continue error #4 - auto.id: " + auto.id);
Run Code Online (Sandbox Code Playgroud)

c# nlog

27
推荐指数
1
解决办法
5646
查看次数