首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows服务日志记录

Windows服务日志记录
EN

Stack Overflow用户
提问于 2019-11-26 16:14:19
回答 1查看 176关注 0票数 0

我有一个Windows,我想用NLog记录一些信息。我的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">
  <time type="AccurateUtc" />

  <targets>
    <target name="debug-logfile" xsi:type="File" fileName="${specialfolder:folder=ApplicationData}/log/${date:format=yyyy-MM}.log" layout="${longdate} | ${level} | ${message}" />
    <target name="trace-logfile" xsi:type="File" fileName="${specialfolder:folder=ApplicationData}/log/trace/${date:format=yyyy-MM-dd}.log" layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fffffff} | ${level} | ${message}" />
    <target name="errorfile" xsi:type="File" fileName="${specialfolder:folder=ApplicationData}/log/Error.log" layout="${longdate} | ${level} | ${message}" />
    <target name="console" xsi:type="Console" layout="${longdate} | ${level} | ${callsite} | ${message}"/>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="trace-logfile" />
    <logger name="*" minlevel="Debug" writeTo="debug-logfile" />
    <logger name="*" minlevel="Error" writeTo="errorfile" />
  </rules>
</nlog>

现在的问题是,我的服务的%appdata%文件夹是:C:\Windows\System32\config\systemprofile\AppData\Roaming和NLog不能写入这个文件夹。有人能告诉我如何访问此文件夹或将其更改为默认的ServiceProfile文件夹吗?(C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\ATLED\log\trace)

我认为,当我将服务提供给本地服务用户时,可以对其进行更改,但它是安装在WIX上的,因此可能存在问题。在这里,WIX代码示例:

代码语言:javascript
复制
<Component Id="CMP_Service" Feature="Core">
            <File Source="$(var.Servie.TargetPath)" KeyPath="yes"/>
            <ServiceInstall Id="ServiceInstallELS"
                            Name="Service"
                            Description="..."
                            Start="auto"
              Account="[SERVICEACCOUNT]"
                            ErrorControl="normal"
                            Type="ownProcess"
              Vital="no" />
            <ServiceControl Id="ServiceControllELS"
                            Name="Service"
                            Start="install"
                            Stop="both"
                            Remove="uninstall"
                            Wait="no" />
          </Component>

编辑

使用installutil.exe,服务将其日志写入:C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\ATLED\log\trace

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-28 11:53:43

我是NLog的新手。但是,当我在windows服务中使用Log4Net时,也遇到了类似的问题。我从代码中手动设置了"appdata“路径。在NLog中还必须有一种方法从代码中手动设置此路径。

但是,当windows服务像您提到的那样运行时,它将采用"appdata“路径作为您提到的路径。为了克服这个问题,我使用了WMI windows API。请参考下面的示例。

这里的想法是从WMI中获取UserName并手动构造路径。

代码语言:javascript
复制
 private string GetWindowsUserAccountName()
        {
            string userName = string.Empty;

            ManagementScope ms = new ManagementScope("\\\\.\\root\\cimv2");
            ObjectQuery query = new ObjectQuery("select * from win32_computersystem");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(ms, query);

            foreach (ManagementBaseObject mo in searcher?.Get())
            {
                userName = mo["username"]?.ToString();
            }
            userName = userName?.Substring(userName.IndexOf(@"\",StringComparison.InvariantCulture) + 1);

            FCLogger.Logger.LogDebug("[ReturnWindowsUserAccountName]UserName Fetched:" + userName);

            return userName;
        }

您可以自己构造路径,因为这里只有UserName是未知字段。

代码语言:javascript
复制
var userName = GetWindowsUserAccountName();
var appDataPath = Path.Combine(LoggerConstants.C, LoggerConstants.USERS, userName, LoggerConstants.APP_DATA, LoggerConstants.ROAMING); 
//Ex: "C:\\Users\\" + userName from WMI +"\\AppData"+"\\Roaming" ;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59055127

复制
相关文章

相似问题

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