我正在创建一个Windows服务,我想使用NLog.我希望将日志写入服务的安装位置,如下所示:
PathToInstalledService\Logs\MyLog.txt
Run Code Online (Sandbox Code Playgroud)
这当然需要管理员维护.所以我的问题是,在为服务创建安装时,我应该在ServiceProcessInstaller上使用什么帐户.我一直在使用LocalService,但此帐户没有所需的高程.
谢谢.
我写了以下代码:
public class Log
{
public static void Info(string message, int arg)
{
Logger.Info(message, arg);
}
}
public class Task
{
public void StartTask()
{
var i =10;
Log.Info(" i = ", i);
}
}
Run Code Online (Sandbox Code Playgroud)
但是在日志文件中包含:
2012-09-17 10:41:00.0789 | Info | i=
Run Code Online (Sandbox Code Playgroud)
这是配置文件:
<?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" throwExceptions="true">
<targets>
<target name="logfile" xsi:type="File" fileName="C:\KazbiletLog.txt" layout="${longdate} | ${level} | ${message} ${exception:format=ToString,StackTrace}${newline}" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>
Run Code Online (Sandbox Code Playgroud) 我有两个同时存在于同一进程中的SharePoint计时器作业.这些工作彼此无关,并且不能共享NLog配置.但是,它们倾向于相互重叠配置,记录每个其他文件.
所有配置均由代码完成.命名目标并命名记录器.我确保获得当前LogManager.Configuration的引用并重新加载它.
第一个计时器作业配置:
if (LogManager.Configuration == null)
{
LogManager.Configuration = new LoggingConfiguration();
}
var fileTarget = new FileTarget();
LogManager.Configuration.AddTarget("file", fileTarget);
fileTarget.Encoding = Encoding.UTF8;
fileTarget.FileName = "C:/OTDPLog/Log-{0}.txt"._Format(DateTime.Now.ToString("dd-MM-yyyy_hhmmss"));
fileTarget.Layout = "${date:format=HH\\:mm\\:ss} ${logger} ${event-context:item=Dev} [${level:uppercase=true}]\t${message}. ${exception:format=ToString,StackTrace}";
var async = new AsyncTargetWrapper(fileTarget, 5000, AsyncTargetWrapperOverflowAction.Block);
var rule = new LoggingRule("OTDP", LogLevel.Debug, async);
LogManager.Configuration.LoggingRules.Add(rule);
LogManager.Configuration.Reload();
Run Code Online (Sandbox Code Playgroud)
用法:
var logger = LogManager.GetLogger("OTDP");
logger.Info("bla bla bla");
Run Code Online (Sandbox Code Playgroud)
其他工作的配置:
if (LogManager.Configuration == null)
{
LogManager.Configuration = new LoggingConfiguration();
}
var fileTarget = new FileTarget();
LogManager.Configuration.AddTarget("file", fileTarget);
fileTarget.Encoding = Encoding.UTF8;
fileTarget.FileName = …Run Code Online (Sandbox Code Playgroud) 我有以下NLog 2.0代码来记录异常:
Dim theEvent = NLog.LogEventInfo.Create(NLog.LogLevel.Error, loggerName, message, ex)
Run Code Online (Sandbox Code Playgroud)
升级到NLog 4.1后,我看到以下警告:
函数Create(logLevel As LogLevel,loggerName As String,message As String,exception As Exception)由于LogEventInfo'已过时:'使用Create(LogLevel logLevel,string loggerName,Exception exception,IFormatProvider formatProvider,string message)'
...它要求我添加IFormatProvider formatProvider作为参数.我应该在那里添加什么?
Dim theEvent = NLog.LogEventInfo.Create(NLog.LogLevel.Error, loggerName, ex, ???, message)
Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用nlog logger.
我的程序根据从sql server获取的数据生成xml文件.我正在用PLINQ做这个.但我也必须记录跟踪信息,以便能够对prod环境中的特殊情况进行一些调查.
当来自多个线程时,结果日志看起来很糟糕.例如:
Operation 1 starded
Deserializing XXX
Operation 2 started
Deserializing XXX finished with status X
Filling XXX with data from Z
Deserializing YYY....
Run Code Online (Sandbox Code Playgroud)
它只是为了并行度2.
我想看到这样的结果:
Operation 1 starded
Deserializing XXX
Deserializing XXX finished with status X
Filling XXX with data from Z
Operation 1 finished
Operation 2 started
Deserializing YYY....
Run Code Online (Sandbox Code Playgroud)
我看到了一些解决方案,但它们看起来不够好:
这个问题有一些干净的解决方案吗?
使用NLog是否可以定义LogEventInfo日志的全局属性?使用构造
var logEventInfo = new LogEventInfo(LogLevel.Trace, Log.Name, "Hello world");
logEventInfo.Properties["messageName"] = "MessageName2";
Run Code Online (Sandbox Code Playgroud)
不适合,因为在大型项目中到处都使用Info(...)类似的方法。但是我们需要添加一些参数以在Gelf登录时监视它们,而无需重写代码。
我为我的ASP.NET应用程序启动并运行了Application Insights.然后,我安装了Microsoft.ApplicationInsights.NLogTarget包并添加ApplicationInsightsTarget到我的NLog配置中.它似乎工作正常.至少我可以看到传出的请求dc.services.visualstudio.com:443.现在,Azure Portal上的哪个位置可以看到我的日志条目?应用程序洞察 - >活动日志页面始终为空.
更新: 问题是我认为所有常规NLog消息都应该按照事件类别显示,即信息,警告等.但实际情况是,任何NLog消息都在Application Insights中作为TRACE条目.有点令人失望.
我正在使用NLog作为记录器。当我运行.exe,甚至通过Visual Studio进行调试时,登录时一切正常,NLog仍会写入该文件。
但是,如果我运行一个通过单元测试调用记录器的对象,则会创建该文件,但该文件为空。我是否需要添加到配置中以使NLog在单元测试下写入文件,需要额外的设置/规则?
我可以为此模拟NLog并且没有日志转储,但是我想看看是否可以在决定模拟NLog之前使其工作。即使这仅在单元测试中发生并且在其他情况下仍然有效,这还是我的配置和日志记录代码。我忽略了文件名。
public static void Info(string app, string m) => EngineLogger.Logger.Info($"{app} : {m}");
<targets>
<target name="infoFile"
xsi:type="File"
layout="${date:format=yyyy-MM-dd HH\:mm\:ss} ${pad:padding=5:inner=${level:uppercase=true}} ${logger} ${message}"
fileName="leftoutForQuestion"
keepFileOpen="false"
encoding="iso-8859-2" />
<target name="errorFile"
xsi:type="File"
layout="${date:format=yyyy-MM-dd HH\:mm\:ss} ${pad:padding=5:inner=${level:uppercase=true}} ${logger} ${message}"
fileName="leftOutForQuestion"
keepFileOpen="false"
encoding="iso-8859-2" />
</targets>
<rules>
<logger name="*" minlevel="Debug" maxlevel="Info" writeTo="infoFile" />
<logger name="*" minlevel="Warn" maxlevel="Fatal" writeTo="errorFile" />
</rules>
Run Code Online (Sandbox Code Playgroud)
这是内部日志中的错误:
Error Error has been raised. Exception: System.Runtime.InteropServices.COMException (0x800700A1): The specified path is invalid. (Exception from HRESULT: 0x800700A1)
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at NLog.Internal.FileAppenders.BaseFileAppender.WindowsCreateFile(String …Run Code Online (Sandbox Code Playgroud) 我正在为NLog编写WEB API调用,因此远程应用程序可以登录到我的日志记录表.
在我的控制器中我(现在硬编码为完整性检查):
NLogger.LogError("Some Error Message", "An exception", 5, "A computer name");
Run Code Online (Sandbox Code Playgroud)
然后我的静态LogError方法看起来像这样(我也尝试了LogEventInfo()):
public static void LogError(string msg, string ex, int appid, string machineName)
{
LogEventInfo logEvent = new LogEventInfo(LogLevel.Error, "Api Logger", "Another test msg");
logEvent.Properties["myMsg"] = msg;
logEvent.Properties["myEx"] = ex;
logEvent.Properties["myAppId"] = appid;
logEvent.Properties["myMachineName"] = machineName;
NLogManager.Instance.Log(logEvent);
}
Run Code Online (Sandbox Code Playgroud)
最后,这是我的代码首次配置该规则(其他2个具有不同的数据库目标):
private static void ConfigureApiLog()
{
var dbApiErrorTarget = new DatabaseTarget
{
ConnectionString = ConnectionFactory.GetSqlConnection().ConnectionString,
CommandText = "usp_LogError",
CommandType = CommandType.StoredProcedure
};
dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@level",
new global::NLog.Layouts.SimpleLayout("${level}")));
dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@logger",
new global::NLog.Layouts.SimpleLayout("${logger}")));
dbApiErrorTarget.Parameters.Add(new …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用.net Core 2.0中的NLog将各种日志写入数据库和文件.问题是,将日志写入文件工作完全正常.但是在将日志写入数据库时总是会出现以下错误:
2018-01-10 08:48:29.5666错误初始化目标'数据库目标[db]'时出错.异常:System.TypeLoadException:无法从程序集'NLog,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 5120e14c03d0593c'加载类型'System.Data.SqlClient'.at System.RuntimeTypeHandle.GetTypeByName(String name,Boolean throwOnError,Boolean ignoreCase,Boolean reflectionOnly,StackCrawlMarkHandle stackMark,IntPtr pPrivHostBinder,Boolean loadTypeFromPartialName,ObjectHandleOnStack type,ObjectHandleOnStack keepalive)at System.RuntimeTypeHandle.GetTypeByName(String name,Boolean throwOnError,Boolean ignoreCase,布局reflectionOnly,StackCrawlMark&stackMark,IntPtr pPrivHostBinder,Boolean loadTypeFromPartialName)System.RuntimeType.GetType(String typeName,Boolean throwOnError,Boolean ignoreCase,Boolean reflectionOnly,StackCrawlMark&stackMark),位于NLog的System.Type.GetType(String typeName,Boolean throwOnError).在NLog.Targets.Titget.Initialize(LoggingConfiguration配置)的NLog.Targets.DatabaseTarget.InitializeTarget()中的Targets.DatabaseTarget.SetConnectionType()
但是我的项目中有System.Data.SqlClient如下:
<ItemGroup>
<PackageReference Include="EPPlus.Core" Version="1.5.4" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.0-beta3" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Session" Version="2.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" PrivateAssets="All" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.1" PrivateAssets="All" />
<PackageReference Include="NLog" Version="4.5.0-rc03" />
<PackageReference …Run Code Online (Sandbox Code Playgroud)