【问题标题】:NLog: LayoutRenderer cannot be found: 'aspnet-user-identityNLog:找不到 LayoutRenderer:'aspnet-user-identity
【发布时间】:2019-10-09 15:35:25
【问题描述】:

我尝试在我的 .NET Core Api Web 服务中实现 NLog。 我想登录到 Oracle 数据库。通过一个 nlog.config XML 文件,一切正常。

但目标是将 NLog 配置实现到 appsettings.json 中,这里就会出现问题。 我在标题中设置了错误:

找不到LayoutRenderer:'aspnet-user-identity

我的配置文件是这样的:

"NLog": {
    "autoReload": true,
    "throwConfigExceptions": true,
    "internalLogLevel": "info",
    "internalLogFile": "c:/app/log/dev/internal-appsetting-nlog.txt",
    "extensions": {
        "NLog.Extensions.Logging": {
            "assembly": [
                "NLog.Extensions.Logging",
                "NLog.Web.AspNetCore"
            ]
        }
    },
    "variables": {
        "var_logdir": "c:/app/log/dev"
    },
    "default-wrapper": {
        "type": "AsyncWrapper",
        "overflowAction": "Block"
    },
    "targets": {
        "all-file": {
            "type": "File",
            "fileName": "${var_logdir}/nlog-all-${shortdate}.log",
            "layout": {
                "type": "JsonLayout",
                "Attributes": [
                    {
                        "name": "timestamp",
                        "layout": "${date:format=o}"
                    },
                    {
                        "name": "level",
                        "layout": "${level}"
                    },
                    {
                        "name": "logger",
                        "layout": "${logger}"
                    },
                    {
                        "name": "message",
                        "layout": "${message:raw=true}"
                    },
                    {
                        "name": "properties",
                        "encode": false,
                        "layout": {
                            "type": "JsonLayout",
                            "includeallproperties": "true"
                        }
                    }
                ]
            }
        },
        "db": {
            "type": "Database",
            "commandText": "INSERT INTO logtable (LOGLEVEL,LOGGER,MESSAGE,MACHINENAME,USERNAME,CALLSITE, THREADID,EXCEPTIONMESSAGE,STACKTRACE,SESSIONID) VALUES (:pLEVEL,:pLOGGER,:pMESSAGE,:pMACHINENAME, :pCALLSITE,:pTHREADID,:pEXCEPTIONMESSAGE,:pSTACKTRACE)",
            "parameters": [
                {
                    "name": "@pLEVEL",
                    "layout": "${level}"
                },
                {
                    "name": "@pLOGGER",
                    "layout": "${logger}"
                },

                {
                    "name": "@pMESSAGE",
                    "layout": "${message}"
                },
                {
                    "name": "@pMACHINENAME",
                    "layout": "${machinename}"
                },
                {
                    "name": "@pUSERNAME",
                    "layout": "${aspnet-user-identity}"
                },
                {
                    "name": "@pCALLSITE",
                    "layout": "${callsite:filename=true}"
                },
                {
                    "name": "@pTHREADID",
                    "layout": "${threadid}"
                },
                {
                    "name": "@pEXCEPTIONMESSAGE",
                    "layout": "${exception}"
                },
                {
                    "name": "@pSTACKTRACE",
                    "layout": "${stacktrace}"
                },
                {
                    "name": "@pSESSIONID",
                    "layout": "${aspnet-sessionid}"
                }
            ],
            "dbProvider": "Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess",
            "connectionString": "xxxxxxxxxxxx"
        }
    },
    "rules": [
        {
            "logger": "*",
            "minLevel": "Trace",
            "writeTo": "all-file"
        },
        {
            "logger": "*",
            "minLevel": "Trace",
            "writeTo": "db"
        },
        {
            "logger": "Microsoft.*",
            "maxLevel": "Info",
            "final": true
        }
    ]
},

内部调试器报告:

2019-10-09 16:48:48.6665 Info Adding target AsyncTargetWrapper(Name=all-file)
2019-10-09 16:48:48.7859 Warn Error when setting property 'Layout' on 'NLog.Targets.DatabaseParameterInfo' Exception: System.ArgumentException: LayoutRenderer cannot be found: 'aspnet-user-identity'. Is NLog.Web not included?
   at NLog.Config.Factory`2.CreateInstance(String itemName)
   at NLog.Layouts.LayoutParser.GetLayoutRenderer(ConfigurationItemFactory configurationItemFactory, String name)
   at NLog.Layouts.LayoutParser.ParseLayoutRenderer(ConfigurationItemFactory configurationItemFactory, SimpleStringReader stringReader)
   at NLog.Layouts.LayoutParser.CompileLayout(ConfigurationItemFactory configurationItemFactory, SimpleStringReader sr, Boolean isNested, String& text)
   at NLog.Layouts.SimpleLayout.set_Text(String value)
   at NLog.Internal.PropertyHelper.TryNLogSpecificConversion(Type propertyType, String value, Object& newValue, ConfigurationItemFactory configurationItemFactory)
   at NLog.Internal.PropertyHelper.SetPropertyFromString(Object obj, String propertyName, String value, ConfigurationItemFactory configurationItemFactory)

${aspnet-sessionid} 发生错误。如果我注释掉这两种布局,一切正常。

我在 GitHub 问题报告中发现了不同的东西,但我尝试的只是失败。

有人可以帮忙吗?

【问题讨论】:

    标签: oracle nlog appsettings


    【解决方案1】:

    未知的aspnet-user-identity 可能是您的扩展程序的问题:

    "extensions": [
      { "assembly": "NLog.Extensions.Logging" },
      { "assembly": "NLog.Web.AspNetCore" }
    ],
    

    你能试试上面的建议吗?

    附:更新了wiki 以包含多个“扩展”的示例

    【讨论】:

    • 嗨,不,它不起作用,调试和内部日志中的消息完全相同,我尝试以相同的方式添加 NLog.Web,但没有运气。
    • @user2776069 很抱歉。从您的原始示例中复制了太多内容。现在已经修复了 json,所以它应该可以工作了。
    • @user2776069 现在可以用了吗?请接受然后回答:)
    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多