标签: nlog

使用NLog的Windows服务

我正在创建一个Windows服务,我想使用NLog.我希望将日志写入服务的安装位置,如下所示:

PathToInstalledService\Logs\MyLog.txt
Run Code Online (Sandbox Code Playgroud)

这当然需要管理员维护.所以我的问题是,在为服务创建安装时,我应该在ServiceProcessInstaller上使用什么帐户.我一直在使用LocalService,但此帐户没有所需的高程.

谢谢.

c# windows-services nlog

2
推荐指数
1
解决办法
5570
查看次数

nlog:没有方法的工作参数

我写了以下代码:

public class Log
{
    public static  void Info(string message, int arg)
    {
         Logger.Info(message, arg);                
    }
}
public class Task
{
    public void StartTask()
    {
        var i =10;
        Log.Info(" i = ", i);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在日志文件中包含:

2012-09-17 10:41:00.0789 | Info | i= 
Run Code Online (Sandbox Code Playgroud)

这是配置文件:

<?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" throwExceptions="true">

  <targets>
    <target name="logfile" xsi:type="File" fileName="C:\KazbiletLog.txt" layout="${longdate} | ${level} | ${message} ${exception:format=ToString,StackTrace}${newline}" />
  </targets>

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

c# nlog

2
推荐指数
1
解决办法
1861
查看次数

使用具有不同目标的NLog在同一进程中的多个应用程序

我有两个同时存在于同一进程中的SharePoint计时器作业.这些工作彼此无关,并且不能共享NLog配置.但是,它们倾向于相互重叠配置,记录每个其他文件.

所有配置均由代码完成.命名目标并命名记录器.我确保获得当前LogManager.Configuration的引用并重新加载它.

第一个计时器作业配置:

if (LogManager.Configuration == null)
{
    LogManager.Configuration = new LoggingConfiguration();
}

var fileTarget = new FileTarget();
LogManager.Configuration.AddTarget("file", fileTarget);

fileTarget.Encoding = Encoding.UTF8;
fileTarget.FileName = "C:/OTDPLog/Log-{0}.txt"._Format(DateTime.Now.ToString("dd-MM-yyyy_hhmmss"));
fileTarget.Layout = "${date:format=HH\\:mm\\:ss} ${logger} ${event-context:item=Dev} [${level:uppercase=true}]\t${message}.  ${exception:format=ToString,StackTrace}";

var async = new AsyncTargetWrapper(fileTarget, 5000, AsyncTargetWrapperOverflowAction.Block);
var rule = new LoggingRule("OTDP", LogLevel.Debug, async);
LogManager.Configuration.LoggingRules.Add(rule);

LogManager.Configuration.Reload();
Run Code Online (Sandbox Code Playgroud)

用法:

var logger = LogManager.GetLogger("OTDP");

logger.Info("bla bla bla");
Run Code Online (Sandbox Code Playgroud)

其他工作的配置:

if (LogManager.Configuration == null)
{
    LogManager.Configuration = new LoggingConfiguration();
}

var fileTarget = new FileTarget();
LogManager.Configuration.AddTarget("file", fileTarget);

fileTarget.Encoding = Encoding.UTF8;
fileTarget.FileName = …
Run Code Online (Sandbox Code Playgroud)

c# sharepoint logging nlog

2
推荐指数
1
解决办法
1327
查看次数

如何将formatProvider参数添加到NLog.LogEventInfo.Create方法?

我有以下NLog 2.0代码来记录异常:

Dim theEvent = NLog.LogEventInfo.Create(NLog.LogLevel.Error, loggerName, message, ex)
Run Code Online (Sandbox Code Playgroud)

升级到NLog 4.1后,我看到以下警告:

函数Create(logLevel As LogLevel,loggerName As String,message As String,exception As Exception)由于LogEventInfo'已过时:'使用Create(LogLevel logLevel,string loggerName,Exception exception,IFormatProvider formatProvider,string message)'

...它要求我添加IFormatProvider formatProvider作为参数.我应该在那里添加什么?

Dim theEvent = NLog.LogEventInfo.Create(NLog.LogLevel.Error, loggerName, ex, ???, message)
Run Code Online (Sandbox Code Playgroud)

nlog iformatprovider

2
推荐指数
1
解决办法
1572
查看次数

使用nlog记录多个线程

我在我的项目中使用nlog logger.

我的程序根据从sql server获取的数据生成xml文件.我正在用PLINQ做这个.但我也必须记录跟踪信息,以便能够对prod环境中的特殊情况进行一些调查.

当来自多个线程时,结果日志看起来很糟糕.例如:

Operation 1 starded
Deserializing XXX
Operation 2 started
Deserializing XXX finished with status X
Filling XXX with data from Z
Deserializing YYY....
Run Code Online (Sandbox Code Playgroud)

它只是为了并行度2.

我想看到这样的结果:

Operation 1 starded
Deserializing XXX
Deserializing XXX finished with status X
Filling XXX with data from Z
Operation 1 finished
Operation 2 started    
Deserializing YYY....
Run Code Online (Sandbox Code Playgroud)

我看到了一些解决方案,但它们看起来不够好:

  1. 将记录数据保存到某个缓冲区并在parralel任务结束时将其刷新 - 我将应该将上下文传递给所有内部方法(看起来很糟糕!).
  2. 添加某种预添加到日志消息以帮助获取某些消息的上下文 - 我必须将预加密传递给每个内部消息(也看起来很糟糕).

这个问题有一些干净的解决方案吗?

c# logging multithreading nlog

2
推荐指数
1
解决办法
9213
查看次数

NLog全局属性

使用NLog是否可以定义LogEventInfo日志的全局属性?使用构造

var logEventInfo = new LogEventInfo(LogLevel.Trace, Log.Name, "Hello world");
logEventInfo.Properties["messageName"] = "MessageName2";
Run Code Online (Sandbox Code Playgroud)

不适合,因为在大型项目中到处都使用Info(...)类似的方法。但是我们需要添加一些参数以在Gelf登录时监视它们,而无需重写代码。

c# parameters nlog

2
推荐指数
1
解决办法
664
查看次数

在哪里可以看到Application Insights中的日志条目?

我为我的ASP.NET应用程序启动并运行了Application Insights.然后,我安装了Microsoft.ApplicationInsights.NLogTarget包并添加ApplicationInsightsTarget到我的NLog配置中.它似乎工作正常.至少我可以看到传出的请求dc.services.visualstudio.com:443.现在,Azure Portal上的哪个位置可以看到我的日志条目?应用程序洞察 - >活动日志页面始终为空.

更新: 问题是我认为所有常规NLog消息都应该按照事件类别显示,即信息,警告等.但实际情况是,任何NLog消息都在Application Insights中作为TRACE条目.有点令人失望.

.net logging nlog azure azure-application-insights

2
推荐指数
1
解决办法
4086
查看次数

NLog和单元测试

我正在使用NLog作为记录器。当我运行.exe,甚至通过Visual Studio进行调试时,登录时一切正常,NLog仍会写入该文件。

但是,如果我运行一个通过单元测试调用记录器的对象,则会创建该文件,但该文件为空。我是否需要添加到配置中以使NLog在单元测试下写入文件,需要额外的设置/规则?

我可以为此模拟NLog并且没有日志转储,但是我想看看是否可以在决定模拟NLog之前使其工作。即使这仅在单元测试中发生并且在其他情况下仍然有效,这还是我的配置和日志记录代码。我忽略了文件名。

public static void Info(string app, string m)  => EngineLogger.Logger.Info($"{app} : {m}");



<targets>
    <target name="infoFile"
            xsi:type="File"
            layout="${date:format=yyyy-MM-dd HH\:mm\:ss} ${pad:padding=5:inner=${level:uppercase=true}} ${logger} ${message}"
            fileName="leftoutForQuestion"
            keepFileOpen="false"
            encoding="iso-8859-2" />
    <target name="errorFile"
            xsi:type="File"
            layout="${date:format=yyyy-MM-dd HH\:mm\:ss} ${pad:padding=5:inner=${level:uppercase=true}} ${logger} ${message}"
            fileName="leftOutForQuestion"
            keepFileOpen="false"
            encoding="iso-8859-2" />
  </targets>
  <rules>
    <logger name="*" minlevel="Debug" maxlevel="Info" writeTo="infoFile" />
    <logger name="*" minlevel="Warn" maxlevel="Fatal" writeTo="errorFile" />
  </rules>
Run Code Online (Sandbox Code Playgroud)

这是内部日志中的错误:

Error Error has been raised. Exception: System.Runtime.InteropServices.COMException (0x800700A1): The specified path is invalid. (Exception from HRESULT: 0x800700A1)
   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at NLog.Internal.FileAppenders.BaseFileAppender.WindowsCreateFile(String …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing nlog visual-studio

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

如何阻止NLog进行双重日志记录

我正在为NLog编写WEB API调用,因此远程应用程序可以登录到我的日志记录表.

在我的控制器中我(现在硬编码为完整性检查):

NLogger.LogError("Some Error Message", "An exception", 5, "A computer name"); 
Run Code Online (Sandbox Code Playgroud)

然后我的静态LogError方法看起来像这样(我也尝试了LogEventInfo()):

public static void LogError(string msg, string ex, int appid, string machineName)
{
    LogEventInfo logEvent = new LogEventInfo(LogLevel.Error, "Api Logger", "Another test msg");
    logEvent.Properties["myMsg"] = msg;
    logEvent.Properties["myEx"] = ex;
    logEvent.Properties["myAppId"] = appid;
    logEvent.Properties["myMachineName"] = machineName;
    NLogManager.Instance.Log(logEvent);
}
Run Code Online (Sandbox Code Playgroud)

最后,这是我的代码首次配置该规则(其他2个具有不同的数据库目标):

private static void ConfigureApiLog()
{
    var dbApiErrorTarget = new DatabaseTarget
    {
        ConnectionString = ConnectionFactory.GetSqlConnection().ConnectionString,
        CommandText = "usp_LogError",
        CommandType = CommandType.StoredProcedure
    };

    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@level",
        new global::NLog.Layouts.SimpleLayout("${level}")));
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@logger",
        new global::NLog.Layouts.SimpleLayout("${logger}")));
    dbApiErrorTarget.Parameters.Add(new …
Run Code Online (Sandbox Code Playgroud)

c# nlog

2
推荐指数
1
解决办法
1186
查看次数

.net Core 2.0的NLog数据库目标

我正在尝试使用.net Core 2.0中的NLog将各种日志写入数据库和文件.问题是,将日志写入文件工作完全正常.但是在将日志写入数据库时​​总是会出现以下错误:

2018-01-10 08:48:29.5666错误初始化目标'数据库目标[db]'时出错.异常:System.TypeLoadException:无法从程序集'NLog,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 5120e14c03d0593c'加载类型'System.Data.SqlClient'.at System.RuntimeTypeHandle.GetTypeByName(String name,Boolean throwOnError,Boolean ignoreCase,Boolean reflectionOnly,StackCrawlMarkHandle stackMark,IntPtr pPrivHostBinder,Boolean loadTypeFromPartialName,ObjectHandleOnStack type,ObjectHandleOnStack keepalive)at System.RuntimeTypeHandle.GetTypeByName(String name,Boolean throwOnError,Boolean ignoreCase,布局reflectionOnly,StackCrawlMark&stackMark,IntPtr pPrivHostBinder,Boolean loadTypeFromPartialName)System.RuntimeType.GetType(String typeName,Boolean throwOnError,Boolean ignoreCase,Boolean reflectionOnly,StackCrawlMark&stackMark),位于NLog的System.Type.GetType(String typeName,Boolean throwOnError).在NLog.Targets.Titget.Initialize(LoggingConfiguration配置)的NLog.Targets.DatabaseTarget.InitializeTarget()中的Targets.DatabaseTarget.SetConnectionType()

但是我的项目中有System.Data.SqlClient如下:

<ItemGroup>
    <PackageReference Include="EPPlus.Core" Version="1.5.4" />
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.0-beta3" />
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.0.1" />
    <PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.0.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.1" />
    <PackageReference Include="Microsoft.AspNetCore.Session" Version="2.0.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" PrivateAssets="All" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.1" PrivateAssets="All" />
    <PackageReference Include="NLog" Version="4.5.0-rc03" />
    <PackageReference …
Run Code Online (Sandbox Code Playgroud)

c# nlog asp.net-core-2.0

2
推荐指数
1
解决办法
4071
查看次数