2017-07-18 41 views
0

我可以在本地机器上写入NLog,但是当我部署到服务器时,它会失败。无法将NLog写入服务器上的光盘

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(); 
     loggerFactory.AddDebug(); 
     loggerFactory.AddNLog(); 
     app.AddNLogWeb(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
     } 
     else 
     { 
      app.UseExceptionHandler(); 
     } 

     app.UseMvc(); 
     SetAutomapper(); 
     try 
     { 
      var logger = LogManager.GetCurrentClassLogger(); 
      logger.Info("Started Properties Web API"); 
     } 
     catch (Exception e) 
     { 

上述代码位于我的Web API核心项目Startup类中。 该错误消息是

SqlException: Error converting data type nvarchar to datetime. 

我使用存储的过程的标准写入NLOG;

ALTER PROCEDURE [dbo].[NLog_AddEntry_p] (
    @machineName nvarchar(200), 
    @siteName nvarchar(200), 
    @logged datetime, 
    @level varchar(5), 
    @userName nvarchar(200), 
    @message nvarchar(max), 
    @logger nvarchar(300), 
    @properties nvarchar(max), 
    @serverName nvarchar(200), 
    @port nvarchar(100), 
    @url nvarchar(2000), 
    @https bit, 
    @serverAddress nvarchar(100), 
    @remoteAddress nvarchar(100), 
    @callSite nvarchar(300), 
    @exception nvarchar(max) 
) AS 
BEGIN 
    INSERT INTO [dbo].[SIR_NLog] (
    [MachineName], 
    [SiteName], 
    [Logged], 
    [Level], 
    [UserName], 
    [Message], 
    [Logger], 
    [Properties], 
    [ServerName], 
    [Port], 
    [Url], 
    [Https], 
    [ServerAddress], 
    [RemoteAddress], 
    [CallSite], 
    [Exception] 
) VALUES (
    @machineName, 
    @siteName, 
    @logged, 
    @level, 
    @userName, 
    @message, 
    @logger, 
    @properties, 
    @serverName, 
    @port, 
    @url, 
    @https, 
    @serverAddress, 
    @remoteAddress, 
    @callSite, 
    @exception 
); 
END 

所以这里的问题是,记录参数字段必须发送一个字符串,而不是一个日期。为什么会这样?

编辑:我NLog.config是

<?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="Warn" 
     internalLogFile="c:\temp\internal-nlog.txt"> 
    <!-- throwExceptions="true"--> 

    <!-- Load the ASP.NET Core plugin --> 
    <extensions> 
    <add assembly="NLog.Web.AspNetCore" /> 
    </extensions> 

    <!-- the targets to write to --> 
    <targets> 
    <target name="db" 
      xsi:type="Database" 
      dbProvider="System.Data.SqlClient" 
      connectionString="${var:SirNLogDb}" 
      commandType="StoredProcedure" 
      commandText="[dbo].[NLog_AddEntry_p]"> 
     <parameter name="@machineName" layout="${machinename}" /> 
     <parameter name="@siteName"  layout="${iis-site-name}" /> 
     <parameter name="@logged"   layout="${date}" /> 
     <parameter name="@level"   layout="${level}" /> 
     <parameter name="@username"  layout="${aspnet-user-identity}" /> 
     <parameter name="@message"  layout="${message}" /> 
     <parameter name="@logger"   layout="${logger}" /> 
     <parameter name="@properties"  layout="${all-event-properties:separator=|}" /> 
     <parameter name="@serverName"  layout="${aspnet-request:serverVariable=SERVER_NAME}" /> 
     <parameter name="@port"   layout="${aspnet-request:serverVariable=SERVER_PORT}" /> 
     <parameter name="@url"   layout="${aspnet-request:serverVariable=HTTP_URL}" /> 
     <parameter name="@https"   layout="${when:inner=1:when='${aspnet-request:serverVariable=HTTPS}' == 'on'}${when:inner=0:when='${aspnet-request:serverVariable=HTTPS}' != 'on'}" /> 
     <parameter name="@serverAddress" layout="${aspnet-request:serverVariable=LOCAL_ADDR}" /> 
     <parameter name="@remoteAddress" layout="${aspnet-request:serverVariable=REMOTE_ADDR}:${aspnet-request:serverVariable=REMOTE_PORT}" /> 
     <parameter name="@callSite"  layout="${callsite}" /> 
     <parameter name="@exception"  layout="${exception:tostring}" /> 
    </target> 
    </targets> 

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

请发布您的NLog配置 – Julian

+0

SQL Server可能不会将其识别为日期,即使它是。您可能必须在布局中格式化它,如$ {date:format = yyyy-MM-dd HH \:mm \:ss.fff} – JAZ

回答

0

所以我发现这个问题是,区域日期设置为每个服务器上的不同。一个是美国英语,另一个是英国人。 这种情况的最简单的解决方案是删除@logged参数,并使用GetDate()来获取当前日期。 可能有更好的解决方案。 SQL Server应该都具有相同的日期设置,但我不确定这会造成什么影响。