我有一个Wpf .net 4.0 C#项目,我试图从使用Log4Net迁移到使用NLog作为Common.LoggingFaçade后面的日志库.我原本以为这是一件容易的事,但你知道他们说的是什么,没有什么比这更容易了.
我用过NuGet来:
在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文件,但我可以,如果这将是有益的.
我已经使用nuget将NLog添加到项目中并添加了NLog.config.我正在运行调试器并得到一个NullReferenceException由于事实LogManager.Configuration是null:
LogManager.Configuration.AddTarget("sentinel", sentinalTarget);
这行代码在静态构造函数中运行.
LogManager.ThrowExceptions是假的,所以我怀疑配置有问题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) 我开发.net核心应用程序并使用NLog作为日志框架.
如何设置NLog布局以获取远程IP地址?
不幸的是,NLog.Web.AspNetCore${aspnet-request.serverVariable=remote_addr}不支持.
可能是我可以以httpContext.Connection.RemoteIpAddress某种方式访问.
我有一个.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) 如果我有这个代码
//Spice Enums
enum SpiceLevels {None = 0 , Mild = 1, Moderate = 2, Ferocious = 3};
Run Code Online (Sandbox Code Playgroud)
其中陈述了枚举名称+他们的号码,如何从变量中调用枚举,如果变量是3,如何调用它并显示凶猛?
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) 我有使用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) 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方法的版本.
如何使用异步支持编写自定义目标?
当我右键单击int我的代码并选择"转到定义"时,Visual Studio会打开一个名为"Int32 [来自元数据]"的文件.该文件包含以下行:
public const Int32 MinValue = --2147483648;
Run Code Online (Sandbox Code Playgroud)
双重标志是什么意思?
我正在运行Visual Studio 15.8.4.根据评论中的信息,这在Visual Studio 2017的所有版本上都不可重现.
直到今天,我们一直使用 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)