小编Jul*_*ian的帖子

常见日志记录无法加载类型NLog.TargetWithLayout

我有一个Wpf .net 4.0 C#项目,我试图从使用Log4Net迁移到使用NLog作为Common.LoggingFaçade后面的日志库.我原本以为这是一件容易的事,但你知道他们说的是什么,没有什么比这更容易了.

我用过NuGet来:

  • 下载NLog版本2.0.1.2.
  • 在版本2.0.0下载Common.Logging.NLog.
  • 在版本2.1.2下载Common.Logging.NLog20.
  • 使用NuGet更新了从2.0.0版到2.1.2版的通用日志记录.

在app.config文件中我有:

<common>
    <logging>
        <factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog">
            <arg key="configType" value="FILE" />
            <arg key="configFile" value="~/NLog.config" />
        </factoryAdapter>
    </logging>
</common>
Run Code Online (Sandbox Code Playgroud)

......而且......

  <dependentAssembly>
    <assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.1.0" newVersion="2.0.1.0" />
  </dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,我收到一个错误说明

'在类型'NameSpace.Shell.AppBootstrapper'上调用与指定绑定约束匹配的构造函数引发了异常.行号'8'和行位置'18'.

内在的例外是:

{"无法加载一个或多个请求的类型.请检索LoaderExceptions属性以获取更多信息."}

说Loader异常,只有一个,是:

{"无法从程序集'NLog加载类型'NLog.TargetWithLayout',Version = 2.0.1.0,Culture = neutral,PublicKeyToken = 5120e14c03d0593c'.":"NLog.TargetWithLayout"}

有没有人克服这个问题或有解决方法NLog working with Common.Logging

为了不发布长期问题,我没有包含该NLog.config文件,但我可以,如果这将是有益的.

c# nlog common.logging

8
推荐指数
1
解决办法
5416
查看次数

LogManager.configuration为null

我已经使用nuget将NLog添加到项目中并添加了NLog.config.我正在运行调试器并得到一个NullReferenceException由于事实LogManager.Configuration是null:

LogManager.Configuration.AddTarget("sentinel", sentinalTarget);

这行代码在静态构造函数中运行.

  • NLog.config位于web.config旁边的项目根目录中.
  • 这发生在visual studio调试器中
  • NLog.config属性"复制到输出目录"="始终复制"
  • 我更新了NLog.config throwExceptions ="true",并且在运行时LogManager.ThrowExceptions是假的,所以我怀疑配置有问题
  • 尝试删除名称为:viewer,DbWin及其相关规则的目标

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="false">

  <variable name="appName" value="YourAppName" />

  <targets async="true">
    <target xsi:type="File"
            name="default"
            layout="${longdate} - ${level:uppercase=true}: ${message}${onexception:${newline}EXCEPTION\: ${exception:format=ToString}}"
            fileName="${specialfolder:ApplicationData}\${appName}\Debug.log"
            keepFileOpen="false"
            archiveFileName="${specialfolder:ApplicationData}\${appName}\Debug_${shortdate}.{##}.log"
            archiveNumbering="Sequence"
            archiveEvery="Day"
            maxArchiveFiles="30"
            />

    <target xsi:type="EventLog"
            name="eventlog"
            source="${appName}"
            layout="${message}${newline}${exception:format=ToString}"/>

    <target xsi:type="NLogViewer"
            name="viewer"
            address="udp://127.0.0.1:9999"/>

    <target xsi:type="OutputDebugString" name="DbWin" layout="Log4JXmlEventLayout">
      <layout xsi:type="Log4JXmlEventLayout" />
    </target>
  </targets>
  <rules>
    <logger name="*" writeTo="default" minlevel="Info" />
    <logger name="*" writeTo="eventlog" minlevel="Error" />
    <logger name="*" …
Run Code Online (Sandbox Code Playgroud)

c# nlog

8
推荐指数
1
解决办法
6666
查看次数

如何配置NLog以获取IP地址.NET Core

我开发.net核心应用程序并使用NLog作为日志框架.

如何设置NLog布局以获取远程IP地址?

不幸的是,NLog.Web.AspNetCore${aspnet-request.serverVariable=remote_addr}不支持.

可能是我可以以httpContext.Connection.RemoteIpAddress某种方式访问.

nlog asp.net-core

8
推荐指数
1
解决办法
3900
查看次数

NLog的依赖注入

我有一个.Net核心Web应用程序,我正在尝试通过NLog添加日志记录.在以前的项目中,我刚刚在每个类的顶部使用了类似下面的内容:

private static Logger logger = LogManager.GetCurrentClassLogger();
Run Code Online (Sandbox Code Playgroud)

我试图在可能的情况下遵循这个项目的更多最佳实践.

我的问题是,如何注入一个记录器,它具有被注入的类的完全限定名称?

在我的startup.cs文件中,到目前为止我有以下内容:

services.AddScoped<BLL.Logging.NLogLogger>();
Run Code Online (Sandbox Code Playgroud)

目前,NLogLogger该类创建了一个NLog Logger的实例GetCurrentClassLogger(),当使用它时,它只会将名称报告为"BLL.Logging.NLogLogger"而不是记录器注入的实际类.

为了简化问题并使其更具通用性:如何传递.Net Core将要注入类的类的名称?

我已经考虑过类似下面的内容,但不知道如何实现它:

services.AddScoped<BLL.Logging.NLogLogger>(serviceProvider => new BLL.Logging.NLogLogger("class name here"));
Run Code Online (Sandbox Code Playgroud)

logging dependency-injection nlog asp.net-core

8
推荐指数
2
解决办法
9953
查看次数

C# - 你能用数值调用枚举吗?

如果我有这个代码

//Spice Enums
enum SpiceLevels {None = 0 , Mild = 1, Moderate = 2, Ferocious = 3};
Run Code Online (Sandbox Code Playgroud)

其中陈述了枚举名称+他们的号码,如何从变量中调用枚举,如果变量是3,如何调用它并显示凶猛?

c#

8
推荐指数
1
解决办法
6967
查看次数

如何在NLog中将不同的布局应用于同一目标?

NLog允许我用来SplitGroup将我的消息记录到多个目标.我想使用此功能一次将每条消息记录到常见的,特定用户和日期的日志中:

<variable name="commonLog" value="${logDir}\Common.log" />
<variable name="username" value="${identity:fSNormalize=true:authType=false:isAuthenticated=false}" />
<variable name="userLog" value="${logDir}\ByUser\${username}.log" />
<variable name="dateLog" value="${logDir}\ByDate\${shortdate}.log" />

<target name="logFiles" xsi:type="SplitGroup">
  <target xsi:type="File" fileName="${commonLog}" layout="${myLayout}" />
  <target xsi:type="File" fileName="${userLog}" layout="${myLayout}" />
  <target xsi:type="File" fileName="${dateLog}" layout="${myLayout}" />
</target>
Run Code Online (Sandbox Code Playgroud)

这很好,但我也想对不同级别的严重性使用不同的布局.例如,errorLayout将包含异常信息和插入[!]标记,以便稍后可以突出显示BareTail等日志查看器中的错误:

<variable name="stamp" value="${date} ${username} ${logger}" />

<variable name="debugLayout" value="${stamp} ... ${message}" />
<variable name="infoLayout" value="${stamp} [i] ${message}" /> 
<variable name="warnLayout" value="${stamp} [!] ${message}" />
<variable name="errorLayout"
   value="${warnLayout}${newline}${pad:padding=10:inner=${exception:format=ToString}}" />

<!-- …
Run Code Online (Sandbox Code Playgroud)

c# configuration redundancy nlog nlog-configuration

7
推荐指数
2
解决办法
6386
查看次数

以编程方式在运行时更改基于NLog目标的基础

我有使用NLog的Windows Forms app .NET 4.5(VS 2013).

我有目标:

<target name="asyncFileLog" xsi:type="AsyncWrapper">
  <target name="logfileTrace" xsi:type="File" fileName="${basedir}/logs/${shortdate}Trace.log" layout="${longdate} ${message}" lineEnding="Default"/>
</target>

<target name="asyncFileError" xsi:type="AsyncWrapper">
  <target name="logfileError" xsi:type="File" fileName="${basedir}/logs/${shortdate}Error.log" layout="${longdate} ${message} ${exception:format=tostring}"  lineEnding="Default"/>
</target>
Run Code Online (Sandbox Code Playgroud)

LogManager.Configuration.AllTargets.ToList(); 返回4项,而不是2项.

我想以编程方式在运行时更改路径$ {basedir}/logs

我试试这个:

var rutaLogs = ConfigurationManager.AppSettings["RutaLog"];
if (!Directory.Exists(rutaLogs)) return;

var list = LogManager.Configuration.AllTargets.ToList();
foreach (var target in list)
{
    FileTarget fileTarget = null;
    var wrapperTarget = target as WrapperTargetBase;

    // Unwrap the target if necessary.
    if (wrapperTarget == null)
    {
        fileTarget = target as FileTarget;
    } …
Run Code Online (Sandbox Code Playgroud)

c# nlog

7
推荐指数
1
解决办法
3586
查看次数

具有异步写入的自定义NLog目标

NLog允许我编写自定义目标.我想使用Entity Framework Core登录我的数据库.

NLog.Targets.Target那里是这样的:

protected virtual void Write(LogEventInfo logEvent);
Run Code Online (Sandbox Code Playgroud)

但是我的代码是异步的,所以我必须这样做:

protected override async Task WriteAsync(LogEventInfo logEvent)
{
    await WriteToEfContext(logEvent);
    // and so on...
}
Run Code Online (Sandbox Code Playgroud)

但是没有Task WriteAsyncwrite方法的版本.

如何使用异步支持编写自定义目标?

c# nlog .net-core

7
推荐指数
1
解决办法
3402
查看次数

为什么C#中的Int32结构的MinValue在其前面有两个减号?

当我右键单击int我的代码并选择"转到定义"时,Visual Studio会打开一个名为"Int32 [来自元数据]"的文件.该文件包含以下行:

public const Int32 MinValue = --2147483648;
Run Code Online (Sandbox Code Playgroud)

双重标志是什么意思?

在此输入图像描述


我正在运行Visual Studio 15.8.4.根据评论中的信息,这在Visual Studio 2017的所有版本上都不可重现.

c# visual-studio

7
推荐指数
1
解决办法
287
查看次数

是否可以在没有模板化消息的情况下使用 NLog 的结构化日志记录?

直到今天,我们一直使用 NLog 版本 4.4.12(没有结构化日志记录)。但是,我们使用https://www.nuget.org/packages/NLog.StructuredLogging.Json/进行结构化日志记录。

使用此扩展的好处是您不需要模板化消息(包含用于记录其他参数/​​对象的索引或占位符)。该消息不包含要记录的其他对象(即匿名类型)的任何索引或占位符。

切换到支持开箱即用结构化日志记录的 NLog 4.6.5,我们希望摆脱额外的 NuGet 包。然而,我们的附加参数仅在使用模板化时记录带有实际索引/命名占位符的消息。

我们的消息中没有索引或占位符确实会导致我们的附加参数/对象无法通过 JSON 呈现。

是否有可能有非模板化的消息,但仍然使用 NLog 的结构化日志记录我们已经传递给它们以添加到 JSON 中的附加参数?

下面是一个例子(请注意,我们在 nlog 周围使用了一个额外的包装器)

日志版本:4.6.5

平台:.Net 4.5

当前 NLog 配置

// Arrange
var typeUsingLogger = typeof(NLogWrapperTest);
var nLogWrapper = new NLogWrapper(typeof(NLogWrapper));

var level = (LogLevel)Enum.Parse(typeof(LogLevel), nLevel.Name);
var message = $"{Guid.NewGuid()}"; // {{extendedLogProperties}}  {{@extendedLogProperties}} {{@purchase}} {{badplaceholder}}
var innerException = new DivideByZeroException("bla inner exception");
var exception = new ArgumentNullException("bla out exception", innerException);
var extendedLogProperties = new
{
    ClientID …
Run Code Online (Sandbox Code Playgroud)

json nlog structured-logging

7
推荐指数
1
解决办法
3495
查看次数