我想明确写入两个不同的日志文件。基于操作的方法或类型。
如何?
我看过以下 StackOverFlow 帖子 Have NLog loggers with different Configuration
如何配置 NLog ?我还需要什么代码,以便我可以写入 1 个文件或另一个文件?使用如下代码log.Error("My Big Error"):
该帖子包含以下内容
<targets>
<target name="f1" xsi:type="File" fileName="${logger}.txt" />
<target name="f2" xsi:type="File" fileName="${shortdate}.txt" />
</targets>
Run Code Online (Sandbox Code Playgroud)
因此,如果是“一般错误”,我想写入f1。如果是文件操作错误我想写入f2
提前谢谢
我仍然没有\xe2\x80\x99t 依赖注入,并且我\xe2\x80\x99m 是新的.Net Core(使用3.1.5)。我\xe2\x80\x99已经为WebAPI创建了一个AuthorizationFilter。我\xe2\x80\x99m 仍然不明白的是如何将我的 Nlog 传递给属性。
\n我有以下内容作为我的 AuthorizaitonFilter
\npublic class TokenAttribute : Attribute, IAuthorizationFilter\n {\n private readonly ILogger _logger;\n\n public TokenAttribute(ILogger logger)\n {\n _logger = logger;\n }\n\n public void OnAuthorization(AuthorizationFilterContext context)\n {\n _logger.LogInformation("Authorizing");\n\n //Get the values from the Request Header\n context.HttpContext.Request.Headers.TryGetValue("Api-Token", out var token);\n context.HttpContext.Request.Headers.TryGetValue("Customer", out var customer);\n\n //Query to look up Customer and Token\n\n using (var ctx = new ModelContext())\n {\n var results = ctx.Token.FromSqlRaw(sbQuery.ToString()).ToList();\n\n if (results == null || results.Count == 0)\n {\n context.Result = …Run Code Online (Sandbox Code Playgroud) 几天前,我在 ASP.Net / .Net 6 环境中从 NLog 4 升级到 NLog v5。当我更新时,我注意到我从比过去更多的记录器中获取了详细信息(我仍然不明白为什么)。
为了减少干扰,我开始在 NLog.config 中创建规则来消除噪音。我使用了 NLog 文档以及这个 SO 问题作为我的指南:NLog禁用特定记录器 - for real。
不幸的是,这些规则似乎被忽视了。我仍然收到大量信息级别的Microsoft.AspNetCore.*日志记录Microsoft.EntityFrameworkCore.*
我在这里缺少一些简单的东西吗?
<?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"
internalLogLevel="Info"
internalLogFile="c:\temp\internal-nlog.txt">
<!-- Ensure all times are logged in UTC -->
<time type="AccurateUTC" />
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
<add assembly="NLog.Database"/>
</extensions>
<!-- the targets to write to -->
<targets>
<target name="db"
xsi:type="Database"
commandType="StoredProcedure"
commandText="[dbo].[NLog_AddEntry_p]"
connectionString="${configsetting:item=ConnectionStrings.DefaultConnection}">
<parameter name="@errorId" layout="${mdlc:item=errorId}" …Run Code Online (Sandbox Code Playgroud) 这是我正在研究的真实代码的最小(和简化)重现,因为它导致了死锁。有OuterClass一些嵌套类,它们通过外部类的初始化进行初始化(并加载一些数据)。重要的是,一旦对象初始化,数据就可用。
public class OuterClass
{
static ILogger Log = LogManager.GetLogger("OuterClass");
private static InnerClass _innerClass;
public static OuterClass Instance { get; private set; }
private OuterClass()
{
Log.Debug("Constructor called");
_innerClass = new InnerClass();
}
static OuterClass()
{
Instance = new OuterClass();
}
public class InnerClass
{
// using it's own logger, it will not dead lock
//static ILogger Log = LogManager.GetLogger("InnerClass");
private String _data;
public InnerClass()
{
LoadOrUpdateDataAsync().Wait(); // will make the second Log.Debug call dead lock
//_ = …Run Code Online (Sandbox Code Playgroud) 可能重复:
使用NLog记录异常时如何获取堆栈跟踪?
抛出异常以从日志中获取清晰图片的最佳做法是什么?
对于日志记录,我使用的是NLog.
以下是简单的代码:
catch (Exception ex)
{
logger.Fatal(ex.Message);
throw new Exception(ex.Message);
}
Run Code Online (Sandbox Code Playgroud)
它没有给我一个好的记录消息.我需要信息,如函数,错误代码行.
我收到错误消息,"错误19'LogManager'是'Common.Logging.LogManager'和'NLog.LogManager'之间的模糊引用".
在C#2008应用程序中,我尝试将nlog开源日志记录工具添加到已经使用从以下位置获取的common.logging的应用程序:http://netcommon.sourceforge.net.
我添加了对NLog文件的引用,并将Nlog添加到using语句中.
问题是两个工具都使用一个名为"LogManager"的对象.
那么你能告诉我如何解决我的问题所以我可以使用两个Logmanagers.
以下是我列出的代码:xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Common.Logging;
using sample;
using System.Configuration;
using System.Xml.Linq;
using NLog;
namespace sample
{
public class Etest
{
private static Logger logger = LogManager.GetCurrentClassLogger();
private static ILog log = LogManager.GetCurrentClassLogger();
}
}
Run Code Online (Sandbox Code Playgroud) 编辑:虽然类似,但这与使用NLog包装器的问题不同.扩展方法增加了另一个间接级别,这使得即使是正确的包装器也会报告错误的调用点
我目前在NLog周围使用了一个日志包装器,我使用他们在源代码中显示的技巧来获取准确的调用点信息.对于我开始的新项目,我想创建一个更简单的类,所以我只是实现了类似下面的接口:
public interface ILogger
{
void Log( LogEntry entry );
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个扩展方法类,如:
public static class LoggerExtensions
{
public static void Debug( this ILogger logger, string format, params object[] args)
{
logger.Log( new LogEntry( LogLevel.Debug, format, args ) );
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是NLog然后将调用点显示为扩展方法而不是扩展方法的调用者.我做了一些搜索,但找不到有关NLog和扩展方法的任何信息.
在这种情况下是否可以修复呼叫站点信息?或者是在接口本身中包含Debug,Info等功能的唯一方法?
我正在使用 NLog 4.3.11 运行应用程序。NLog 有一个配置了日期列的数据库:
<target name="database" xsi:type="Database" dbProvider="System.Data.SqlClient" connectionStringName="${DbConnectionStringName}" commandText="INSERT INTO Log (Logged, Application, Class, Thread, LogLevel, Message, ExceptionDetails, ActivityId, LoggedInUser) Values (@Logged, @Application, @Class, @Thread, @LogLevel, @Message, @ExceptionDetails, @ActivityId, @LoggedInUser)">
<parameter name="@logged" layout="${date}" />
Run Code Online (Sandbox Code Playgroud)
该程序已针对具有各自日期格式的各种德语和英语(美国)Windows Server 2012 和 2016 安装进行了测试;在各种 SQL Server(完整版和快速版)2012、2014 和 2016 实例上都没有问题。日期已正确插入,并由 SSMS 以 ISO 格式正确显示:
2017-06-09 10:24:43.410
Run Code Online (Sandbox Code Playgroud)
然而,在一个系统上,月和日似乎互换了;SSMS 显示如下:
2017-09-06 10:20:43.200
Run Code Online (Sandbox Code Playgroud)
并且MONTH(Logged)也作为 返回9,所以我想我可以排除 SSMS 的问题。
系统也是德国的Server 2012系统,数据库是同一台服务器上的SQL Server Express 2012,系统上的日期格式也是默认的德国(dmY)。日期正确设置为 2017 年 6 月 9 日
可能是什么问题; 我怎么能告诉 NLog 以与格式无关的方式记录当前日期?
我使用nlog和以下设置来记录sql查询:
<logger name="Microsoft.EntityFrameworkCore.*"
minlevel="Trace" writeTo="sqllogfile" final="true" />
Run Code Online (Sandbox Code Playgroud)
它按预期工作,但不记录参数值,查询如下所示:
2017-07-31 13:49:03.8836| INFO |Microsoft.EntityFrameworkCore.Internal.InterceptingLogger`1.Log|Executed DbCommand (8ms) [Parameters=[@__get_Item_0='?' (Size = 450)], CommandType='Text', CommandTimeout='30']
SELECT TOP(1) [e].[Id], [e].[AccessFailedCount], [e].[ConcurrencyStamp], [e].[Email], [e].[EmailConfirmed], [e].[HeliosLoginId], [e].[LockoutEnabled], [e].[LockoutEnd], [e].[Name], [e].[NormalizedEmail], [e].[NormalizedUserName], [e].[PasswordHash], [e].[PhoneNumber], [e].[PhoneNumberConfirmed], [e].[SecurityStamp], [e].[TwoFactorEnabled], [e].[UserName]
FROM [AspNetUsers] AS [e]
WHERE [e].[Id] = @__get_Item_0
Run Code Online (Sandbox Code Playgroud)
是否可以显示@__get_Item_0参数值?
谢谢
我在具有以下基本映像的容器中运行我的应用程序:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
当我发布应用程序时,容器时区是Greenwich Mean Time,因此我在数据库中的 NLog 条目关闭了 6 小时。
我可以通过进入容器并运行来更改时区,
dpkg-configure tzdata并且在重新启动容器后,我的日志条目变得正常。但是,我想知道这是否可以通过 Dockerfile 或运行标志来完成?
我正在使用 ASP.NET Core 记录器和 NLog。当我记录错误/严重异常时,会记录消息,但不会记录异常。
try
{
// my code throws an exception
}
catch (Exception ex)
{
_logger.LogError($"There was an error", ex);
return null;
}
Run Code Online (Sandbox Code Playgroud)
我的 NLog 配置如下所示:
<target xsi:type="File" name="ApiLogger" fileName="Logs\api-${shortdate}.log"
layout="${longdate} - ${uppercase:${level}} - ${threadid} - ${logger} - ${message} ${exception:innerFormat=Message,StackTrace}" />
Run Code Online (Sandbox Code Playgroud)
文件中记录的内容There was an error没有实际的异常和堆栈跟踪。
我开始使用 NLog,我想将每一行都记录到日志文件和控制台中以进行调试。当我尝试记录每个日志操作时,控制台和日志文件中都会打印 2-3 次,而不是在每个目标中打印一次。
我在 NLog.config 文件中配置了 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">
<targets>
<target name="logfile" xsi:type="File" fileName="C:\Users\user\source\repos\TaskSchedulerConsole\Log.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Info" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Warn" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Error" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Fatal" writeTo="logfile, logconsole" />
</rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)
在每个类中,我都创建了一个静态记录器:
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
Run Code Online (Sandbox Code Playgroud)
三重日志记录示例:Program.cs:
try
{
Logger.Info("Program Started.");
}
catch(Exception …Run Code Online (Sandbox Code Playgroud) nlog ×12
c# ×9
.net ×3
asp.net-core ×3
logging ×2
.net-core ×1
async-await ×1
date ×1
deadlock ×1
docker ×1
dockerfile ×1
tzdata ×1