首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“NLog”输入字符串格式不正确。使用windows-标识

“NLog”输入字符串格式不正确。使用windows-标识
EN

Stack Overflow用户
提问于 2022-02-24 15:15:59
回答 1查看 358关注 0票数 0

我正在尝试将一些信息记录到数据库中,但对于nlog配置(直到现在为止,教程中的默认配置还不错),我不确定我的配置中缺少了什么。

当应用程序启动时,我会收到这个错误。

代码语言:javascript
运行
复制
2022-02-24 17:06:46.1375 Error Failed loading from config file location: C:\Repos\App\bin\Debug\netcoreapp3.1\NLog.config Exception: NLog.NLogConfigurationException: Exception when parsing C:\Repos\App\bin\Debug\netcoreapp3.1\NLog.config. 
 ---> System.FormatException: Input string was not in a correct format.
   at System.Text.StringBuilder.FormatError()
   at System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
   at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
   at System.String.Format(String format, Object[] args)
   at NLog.NLogConfigurationException..ctor(Exception innerException, String message, Object[] messageParameters)
   at NLog.Config.LoggingConfigurationParser.ConfigureObjectFromAttributes(Object targetObject, ILoggingConfigurationElement element, Boolean ignoreType)
   at NLog.Config.LoggingConfigurationParser.ParseTargetElement(Target target, ILoggingConfigurationElement targetElement, Dictionary`2 typeNameToDefaultTargetParameters)
   at NLog.Config.LoggingConfigurationParser.ParseTargetsElement(ILoggingConfigurationElement targetsElement)
   at NLog.Config.LoggingConfigurationParser.ParseNLogSection(ILoggingConfigurationElement configSection)
   at NLog.Config.XmlLoggingConfiguration.ParseNLogSection(ILoggingConfigurationElement configSection)
   at NLog.Config.LoggingConfigurationParser.LoadConfig(ILoggingConfigurationElement nlogConfig, String basePath)
   at NLog.Config.XmlLoggingConfiguration.ParseNLogElement(ILoggingConfigurationElement nlogElement, String filePath, Boolean autoReloadDefault)
   at NLog.Config.XmlLoggingConfiguration.ParseTopLevel(NLogXmlElement content, String filePath, Boolean autoReloadDefault)
   at NLog.Config.XmlLoggingConfiguration.Initialize(XmlReader reader, String fileName, Boolean ignoreErrors)
   --- End of inner exception stack trace ---
   at NLog.Config.XmlLoggingConfiguration.Initialize(XmlReader reader, String fileName, Boolean ignoreErrors)
   at NLog.Config.XmlLoggingConfiguration..ctor(XmlReader reader, String fileName, LogFactory logFactory)
   at NLog.Config.LoggingConfigurationFileLoader.LoadXmlLoggingConfiguration(XmlReader xmlReader, String configFile, LogFactory logFactory)
   at NLog.Config.LoggingConfigurationFileLoader.LoadXmlLoggingConfigurationFile(LogFactory logFactory, String configFile)
   at NLog.Config.LoggingConfigurationFileLoader.TryLoadLoggingConfiguration(LogFactory logFactory, String configFile, LoggingConfiguration& config)

我的Config文件如下所示

代码语言:javascript
运行
复制
<?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"
      throwConfigExceptions="true"
      internalLogLevel="trace"
      internalLogFile="c:\temp\internal-nlog-AspNetCore3.txt">

    <!-- enable asp.net core layout renderers -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>

    <!-- the targets to write to -->
    <targets>
        <!-- File Target for all log messages with basic details -->
        <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore3-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

        <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore3-own-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|" />

        <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
        <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />

        <target xsi:type="database" name="database"
            layout="${longdate}|${level:uppercase=true}|${logger}|${message}|identity:${identity}|windows-identity:${windows-identity}">
            <connectionString>
                Data Source=MYCOMPUTER;Initial Catalog=DatabaseName;Integrated Security=True
            </connectionString>
            <commandText>
                INSERT INTO SystemLogging(LogDate,LogLevel,LogLogger,LogMessage,LogMachineName, LogUserName, LogCallSite, LogThread, LogException, LogStackTrace) 
                VALUES(@time_stamp, @level, @logger, @message,@machinename, @user_name, @call_site, @threadid, @log_exception, @stacktrace);
            </commandText>
            <parameter name="@time_stamp" layout="${longdate}"/>
            <parameter name="@level" layout="${level}"/>
            <parameter name="@logger" layout="${logger}"/>
            <parameter name="@message" layout="${message}"/>
            <parameter name="@machinename" layout="${machinename}"/>
            <parameter name="@user_name" layout="${windows-identity:domain=true}"/>
            <parameter name="@call_site" layout="${callsite:filename=true}"/>
            <parameter name="@threadid" layout="${threadid}"/>
            <parameter name="@log_exception" layout="${exception}"/>
            <parameter name="@stacktrace" layout="${stacktrace}"/>
        </target>
    </targets>

    <!-- rules to map from logger name to target -->
    <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />

        <!--Output hosting lifetime messages to console target for faster startup detection -->
        <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />

        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <!-- BlackHole -->

        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    </rules>
</nlog>

事实上,我知道问题就在第28行,db连接的布局中。

代码语言:javascript
运行
复制
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|identity:${identity}|windows-identity:${windows-identity}"

但是,如果删除这一行,则会得到另一个错误。

代码语言:javascript
运行
复制
"LayoutRenderer cannot be found: 'windows-identity'"

这似乎是一个明显的问题,但搜索互联网,我找不到解决办法。任何在NLog方面有更多经验的人,都可以分享一个使用Windows日志记录而不是连接字符串中的用户名/密码的DB日志记录示例。

我也尝试过(在windows-标识中添加了“”,但这也不起作用)

代码语言:javascript
运行
复制
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|identity: '${identity}' | windows-identity: '${windows-identity}'"

编辑:

更新配置

代码语言:javascript
运行
复制
<?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"
      throwConfigExceptions="true"
      internalLogLevel="trace"
      internalLogFile="c:\temp\internal-nlog-AspNetCore3.txt">

    <!-- enable asp.net core layout renderers -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
        <add assembly="NLog.WindowsIdentity"/>
    </extensions>

    <!-- the targets to write to -->
    <targets>
        <!-- File Target for all log messages with basic details -->
        <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore3-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

        <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore3-own-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|" />

        <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
        <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />

        <target xsi:type="database" name="database"
            layout="${longdate}|${level:uppercase=true}|${logger}|${message}|identity:${identity}|windows-identity:${environment-user}">
            <connectionString>
                Data Source=MYCOMPUTER;Initial Catalog=DatabaseName;Integrated Security=True
            </connectionString>
            <commandText>
                INSERT INTO SystemLogging(LogDate,LogLevel,LogLogger,LogMessage,LogMachineName, LogUserName, LogCallSite, LogThread, LogException, LogStackTrace) 
                VALUES(@time_stamp, @level, @logger, @message,@machinename, @user_name, @call_site, @threadid, @log_exception, @stacktrace);
            </commandText>
            <parameter name="@time_stamp" layout="${longdate}"/>
            <parameter name="@level" layout="${level}"/>
            <parameter name="@logger" layout="${logger}"/>
            <parameter name="@message" layout="${message}"/>
            <parameter name="@machinename" layout="${machinename}"/>
            <parameter name="@user_name" layout="${windows-identity:domain=true}"/>
            <parameter name="@call_site" layout="${callsite:filename=true}"/>
            <parameter name="@threadid" layout="${threadid}"/>
            <parameter name="@log_exception" layout="${exception}"/>
            <parameter name="@stacktrace" layout="${stacktrace}"/>
        </target>
    </targets>

    <!-- rules to map from logger name to target -->
    <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />

        <!--Output hosting lifetime messages to console target for faster startup detection -->
        <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />

        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <!-- BlackHole -->

        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    </rules>
</nlog>

结果发现布局不起作用。我删除了它,然后应用程序就会从没有错误开始。但是,为了在db中创建日志,我仍然必须添加一个规则。下面是nlog文件的工作版本。

代码语言:javascript
运行
复制
<?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"
      throwConfigExceptions="true"
      internalLogLevel="trace"
      internalLogFile="c:\temp\internal-nlog-AspNetCore3.txt">

    <!-- enable asp.net core layout renderers -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
        <add assembly="NLog.WindowsIdentity"/>
    </extensions>

    <!-- the targets to write to -->
    <targets>
        <!-- File Target for all log messages with basic details -->
        <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore3-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

        <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore3-own-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|" />

        <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
        <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />

        <target xsi:type="database" name="database">
            <connectionString>
                Data Source=MYCOMPUTER;Initial Catalog=DbName;Integrated Security=True
            </connectionString>
            <commandText>
                INSERT INTO SystemLogging(LogDate,LogLevel,LogLogger,LogMessage,LogMachineName, LogUserName, LogCallSite, LogThread, LogException, LogStackTrace) 
                VALUES(@time_stamp, @level, @logger, @message,@machinename, @user_name, @call_site, @threadid, @log_exception, @stacktrace);
            </commandText>
            <parameter name="@time_stamp" layout="${longdate}"/>
            <parameter name="@level" layout="${level}"/>
            <parameter name="@logger" layout="${logger}"/>
            <parameter name="@message" layout="${message}"/>
            <parameter name="@machinename" layout="${machinename}"/>
            <parameter name="@user_name" layout="${windows-identity:domain=true}"/>
            <parameter name="@call_site" layout="${callsite:filename=true}"/>
            <parameter name="@threadid" layout="${threadid}"/>
            <parameter name="@log_exception" layout="${exception}"/>
            <parameter name="@stacktrace" layout="${stacktrace}"/>
        </target>
    </targets>

    <!-- rules to map from logger name to target -->
    <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />
        <logger name="*" minLevel="Trace" writeTo="database"/>

        <!--Output hosting lifetime messages to console target for faster startup detection -->
        <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />

        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <!-- BlackHole -->

        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    </rules>
</nlog>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-24 17:07:37

NLog数据库-目标没有可以分配的Layout-property。相反,使用输入parameter-collection。

WindowsIdentity-nuget-package是${windows-identity} on NetCore所必需的,必须包括:

代码语言:javascript
运行
复制
<extensions>
    <add assembly="NLog.Web.AspNetCore"/>
    <add assembly="NLog.WindowsIdentity"/>
</extensions>

也许你在找${环境-用户}

另见:https://github.com/NLog/NLog/wiki/Windows-Identity-Layout-Renderer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71254198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档