我可以在本地计算机上写入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 Core项目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
因此,问题在于Logged参数字段必须以字符串而不是日期发送。为什么会这样?
编辑:我的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>
答案 0 :(得分:0)
所以我发现的问题是每个服务器上的区域日期设置不同。一个是美国英语,另一个是英国人。 这种情况最简单的解决方案是删除@logged参数,然后使用GetDate()来获取当前日期。 可能有更好的解决方案。 SQL Server应该都具有相同的日期设置,但我不确定它的效果是什么。