我目前将所有log4net事件写入数据库,它似乎工作正常.要捕获登录的用户帐户,我使用以下代码:
HttpContext context = HttpContext.Current;
if (context != null && context.User != null && context.User.Identity.IsAuthenticated)
{
MDC.Set("user", HttpContext.Current.User.Identity.Name);
}
Run Code Online (Sandbox Code Playgroud)
代码似乎没问题,除了没有与之关联的用户上下文的事件(即我们公共网页上的用户).在这种情况下,log4net捕获似乎有时写入最后登录的用户帐户(坏),有时写入空(好).任何人都有这个功能在所有情况下都可靠地工作?我相信我看到一条说明MDC不再是推荐使用的功能,但我无法找到任何推荐的替代品.
注意:我发现MDC设置了帐户名称很奇怪,但如果没有用户处于活动状态,则永远不会清除.这可能是问题的一部分.但是,我没有找到任何也清除用户名的MDC代码提取.
我有一个应用程序,使用数据库中每个表的stl-map在内存中实现整个数据库.
stl-map中的每个项都是一个复杂的对象,引用其他stl-maps中的其他项.
该应用程序使用大量数据,因此它使用超过500 MB的RAM.客户端可以联系应用程序并获取整个数据库的筛选版本.这是通过遍历整个数据库并查找与客户端相关的项目来完成的.
当应用程序运行一个小时左右时,Windows 2003 SP2开始为应用程序分页RAM的部分内容(尽管机器上有16 GB的RAM).
部分页面调度应用程序后,客户端登录需要很长时间(10分钟),因为它现在为stl-map中的每个指针查找生成页面错误.如果在此之后第二次运行客户端登录,则它很快(几秒),因为所有内存现在都回到RAM中.
我可以看到有可能告诉Windows将内存锁定在RAM中,但这通常仅建议用于设备驱动程序,并且仅用于"小"内存量.
我想一个糟糕的勒芒解决方案可能是遍历整个内存数据库,因此告诉Windows我们仍然有兴趣将数据模型保存在RAM中.
我想另一个糟糕的解决方案可能是在Windows上完全禁用页面文件.
我想昂贵的解决方案是SQL数据库,然后重写整个应用程序以使用数据库层.然后希望数据库系统将实现快速访问的手段.
还有其他更优雅的解决方案吗?
我需要在 appsettings.json 中的两个位置使用数据库连接字符串。
是否可以在 json 文件中引入公共变量或 json-path 相关引用以避免潜在的问题?
如果能在不接触 C# 代码的情况下拥有它,那就太棒了。
{
...
"ConnectionStrings": {
"Default": "Host=localhost;Database=db;Port=5432;Username=postgres;Password=postgres"
},
"Nlog": {
"targets": {
"database": {
"type": "Database",
"dbProvider": "Npgsql.NpgsqlConnection, Npgsql",
"connectionString": "Host=localhost;Database=db;Port=5432;Username=postgres;Password=postgres",
...
}
}
...
}
Run Code Online (Sandbox Code Playgroud) 我见过使用 XML 进行过滤的多个示例,但我使用 appsettings.json 进行所有配置。我已经能够实现单个when 过滤器,但是当我尝试添加额外的过滤器时,我收到重复的键错误。有任何想法吗?
这有效 -
"rules": [
{
"logger": "*",
"minLevel": "Debug",
"writeTo": "db",
"filters": {
"when": {
"condition": "equals('${event-properties:sublevel}','diagnostic')",
"action": "Ignore"
}
}
}
]
Run Code Online (Sandbox Code Playgroud) 我有以下 NLog 配置文件。它设置为每天存档,最初我只有 MaxArchiveFiles。现在我只想保留 X 天的存档文件,并找到了表示 MaxArchiveDays 在 v4.7 及更高版本中可用的信息。因此,我升级到了 v4.7,但现在它似乎无法按天数或文件编号进行存档。
有人发现 NLog v4.7 的配置文件有什么问题吗?
<?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">
<variable name="LogDirectory" value="D:/Logs/HRImport"/>
<targets async="true">
<target name="DefaultTarget"
xsi:type="File"
fileName="${LogDirectory}/LogFile.log"
encoding="utf-8"
layout="${longdate} | ${callsite} | ${message}"
archiveFileName="${LogDirectory}/Archive/${shortdate}_log.{#}.log"
archiveAboveSize="3145728"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="3"
maxArchiveDays="2"
/>
<!--1 meg: 1048576 -->
<target name="ConsoleTarget"
xsi:type="Console"
layout="${longdate} ${logger:shortName=True} ${message}${onexception:EXCEPTION OCCURRED\:${exception:format=type,message,StackTrace,method:maxInnerExceptionLevel=8:innerFormat=type,message,StackTrace,method}}"
/>
</targets>
<rules>
<logger name="defaultLogger" minlevel="Debug" writeTo="DefaultTarget,ConsoleTarget" />
</rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)
** 更新 **
<target name="DefaultTarget"
xsi:type="File"
fileName="${LogDirectory}/LogFile.log"
encoding="utf-8"
layout="${longdate} | ${callsite} | ${message}" …Run Code Online (Sandbox Code Playgroud) 我有一个系统,我想制作自定义日志来为每个用户创建单独的文件夹。现在,我在 NLog.Logger 中将其制作为自定义文件目标
public static LogFactory ConfigureCustomNLog(string userName)
{
var target = new FileTarget();
target.Name = "fileLog";
target.FileName = $"${{basedir}}/log" + $"/{userName}/{userName}" + "${shortdate}.log";
target.Layout =
"${longdate}|${uppercase:${level}} ${logger}|${message} ${exception:format=ToString,StackTrace}";
var config = ConfigureNLog("NLog.Config").Configuration;
config.RemoveTarget("fileLog");
config.AddTarget(target.Name, target);
var rule = new LoggingRule(userName, LogLevel.Debug, target);
config.LoggingRules.Add(rule);
LogManager.Configuration = config;
return LogManager.LogFactory;
}
Run Code Online (Sandbox Code Playgroud)
一切工作正常,但我想使用 Microsoft.Extensions.ILogger。如何将 NLog.Logger 导入到 ILogger?或者如何为 ILogger 进行自定义配置?
我们在 .net 5.0 Web API 中使用 NLog,感觉日志级别是在多个位置设置的。有没有一种方法可以配置 nLog 以使用应用程序设置并忽略 nLog.config 日志级别?
nlog.config:
<rules>
<logger name="*" levels="Trace,Debug,Info,Warn,Error,Fatal" writeTo="NLogTarget"/>
</rules>
Run Code Online (Sandbox Code Playgroud)
应用程序设置.json:
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Debug"
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢。
任何人都可以为我提供一个非常样本的自定义layoutrenderer用于nlog吗?
举例来说,我希望在im log中进行缩进
如果我从方法C调用方法B
文本日志文件如下所示:
Inside Method C
Inside Method B
Run Code Online (Sandbox Code Playgroud)
等等.
基本上标题本身有点解释了我想要实现的目标,但更详细:
假设该布局具有类似于以下 XML 设置的内容:
布局=“<日志级别='${level:lowerCase=True}'时间='${longdate:universalTime=true}'myCustomProperty1='${event-properties:item=myCustomProperty1}'myCustomProperty2='${event-属性:item=myCustomProperty2}'>${newline} ...."
现在,当 myCustomProperty1 设置为“blah1”但 myCustomProperty2 未添加到 eventInfo.Properties 集合时,结果条目如下所示:
<日志级别='blah' 时间='blah' myCustomProperty1='blah1' myCustomProperty2=''> ...
问题是 - 可以做什么(最好在配置文件中)从最终呈现的结果中排除 myCustomProperty2 属性,以便输出如下所示:
<日志级别='blah' 时间='blah' myCustomProperty1='blah1'> ...
这是问题 - 多个线程使用同一个记录器,因此我不能简单地在运行时更改目标的布局配置,因为它可能会对其余线程产生负面影响
预先感谢您的建议。-K
我在 ASP Net Core 5.0 应用程序中使用 NLog.Web.AspNetCore 4.10.0。我创建了一个简单的自定义 ResultLayoutRenderer (为简单起见缩短):
[LayoutRenderer("result-payload")]
public class ResultLayoutRenderer : AspNetLayoutRendererBase
{
protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent)
{
var httpRequest = HttpContextAccessor?.HttpContext?.Request;
var result = httpRequest.Headers["Result"];
builder.Append(result);
}
}
Run Code Online (Sandbox Code Playgroud)
我的 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"
autoReload="true">
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<targets>
<target xsi:type="Null" name="blackhole" />
<target name="database" xsi:type="Database"
dbProvider="Npgsql.NpgsqlConnection, Npgsql"
dbHost="${configsetting:name=NlogConnection.DbHost}"
dbDatabase="${configsetting:name=NlogConnection.Database}"
dbUserName="${configsetting:name=NlogConnection.User}"
dbPassword="${configsetting:name=NlogConnection.Password}"">
<commandText>
INSERT INTO logs (Application, Logged, Level, Message, …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)