小编Rol*_*sen的帖子

使用log4net捕获用户名

我目前将所有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代码提取.

c# asp.net logging log4net

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

如何优化大内存数据库的分页

我有一个应用程序,使用数据库中每个表的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数据库,然后重写整个应用程序以使用数据库层.然后希望数据库系统将实现快速访问的手段.

还有其他更优雅的解决方案吗?

c++ database windows paging memory-management

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

如何引用同一 appsettings.json 文件中的另一个值?

我需要在 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)

json nlog appsettings .net-core asp.net-core

6
推荐指数
2
解决办法
4357
查看次数

如何在 appsettings.json 中为 NLog 日志记录规则指定多个过滤器

我见过使用 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 .net-core

6
推荐指数
1
解决办法
2051
查看次数

NLog 设置未删除 MaxArchiveDays 或 MaxArchiveFiles?

我有以下 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)

c# nlog

5
推荐指数
1
解决办法
5968
查看次数

如何将 Microsoft.Extesions.ILogger 与 NLog 一起使用?

我有一个系统,我想制作自定义日志来为每个用户创建单独的文件夹。现在,我在 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 c# nlog ilogger

5
推荐指数
1
解决办法
7531
查看次数

如何将 NLog 目标与 Microsoft 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)

提前致谢。

logging nlog asp.net-core

5
推荐指数
1
解决办法
1797
查看次数

NLog自定义LayoutRenderer用于范围缩进

任何人都可以为我提供一个非常样本的自定义layoutrenderer用于nlog吗?

举例来说,我希望在im log中进行缩进

如果我从方法C调用方法B

文本日志文件如下所示:

Inside Method C
       Inside Method B
Run Code Online (Sandbox Code Playgroud)

等等.

c# logging nlog

4
推荐指数
1
解决办法
5355
查看次数

Nlog / event-properties:如何提示 NLog 忽略/跳过最终日志条目中的空/空属性

基本上标题本身有点解释了我想要实现的目标,但更详细:

  1. 假设该布局具有类似于以下 XML 设置的内容:

    布局=“<日志级别='${level:lowerCase=True}'时间='${longdate:universalTime=true}'myCustomProperty1='${event-properties:item=myCustomProperty1}'myCustomProperty2='${event-属性:item=myCustomProperty2}'>${newline} ...."

  2. 现在,当 myCustomProperty1 设置为“blah1”但 myCustomProperty2 未添加到 eventInfo.Properties 集合时,结果条目如下所示:

    <日志级别='blah' 时间='blah' myCustomProperty1='blah1' myCustomProperty2=''> ...

  3. 问题是 - 可以做什么(最好在配置文件中)从最终呈现的结果中排除 myCustomProperty2 属性,以便输出如下所示:

    <日志级别='blah' 时间='blah' myCustomProperty1='blah1'> ...

这是问题 - 多个线程使用同一个记录器,因此我不能简单地在运行时更改目标的布局配置,因为它可能会对其余线程产生负面影响

预先感谢您的建议。-K

nlog

3
推荐指数
1
解决办法
2181
查看次数

AspNet Core 5.0并注册自定义NLog LayoutRenderer

我在 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)

c# nlog asp.net-core-5.0

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

为什么静态构造函数中的异步方法会导致死锁?

这是我正在研究的真实代码的最小(和简化)重现,因为它导致了死锁。有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)

.net c# deadlock nlog async-await

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