作为 Windows 服务运行时,.Net Core 6 Worker Service 不写入日志

2024-04-20

我使用 C# / .Net Core 6 (Visual Studio 2022) 创建了一个辅助服务。

如果通过 Visual Studio 运行或直接从 Windows 资源管理器/PowerShell 启动,它会按预期写入日志文件。但是,当作为 Windows 服务安装时,它不会创建或写入日志文件。

这是我的程序.cs:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.File("./logs/log-.txt", rollingInterval:RollingInterval.Day)
    .CreateBootstrapLogger();

try
{
    Log.Information("Starting the Service");

    IHost host = Host.CreateDefaultBuilder(args)
        .UseWindowsService()
        .ConfigureAppConfiguration((hostContext, configBuilder) =>
        {
            configBuilder
                //.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{Environment.MachineName}.json", true, true)
                .Build();
        })
        .UseSerilog((context, services, configuration) => configuration
            .ReadFrom.Configuration(context.Configuration)
            .ReadFrom.Services(services)
            .Enrich.FromLogContext())
        .ConfigureServices((hostContext, services) =>
        {
            ... 
        })
        .Build();

    
    await host.RunAsync();
}
catch (Exception ex)
{
    Log.Fatal(ex, "There was a problem starting the service");
}
finally
{
    Log.Information("Service successfully stopped");

    Log.CloseAndFlush();
}

我在 appsettings.json 中有这个:

  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Sinks.Debug" ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": {
          "path": ".\\logs\\log-.txt",
          "rollingInterval": "Day"
        }
      }
    ],
    "Enrich": [ "FromLogContext" ]
  }

如果我包含“SetBasePath”部分,该服务将无法启动(尽管它仍然通过 Visual Studio 运行)。

我从 Visual Studio 发布服务,目标框架 = net6.0,部署模式 = 框架相关,目标运行时 = win-x64。

注意:我在 Program.cs 中创建了一个 Logger,因为我想记录服务的启动和停止/崩溃。


正如其他人所指出的,服务运行的工作目录与进程位置不同。我喜欢用的一个老技巧 https://blog.stephencleary.com/2009/10/managed-windows-services-basics.html首先是将工作目录设置为进程的二进制目录:

Environment.CurrentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

作为 Windows 服务运行时,.Net Core 6 Worker Service 不写入日志 的相关文章

随机推荐

  • JTextArea 组件中的 Unicode 支持 [重复]

    这个问题在这里已经有答案了 我制作了这个简单的程序 我想在 JTextArea 中显示 unicode 符文字符 u16e6 该符号显示在 JFrame 的顶部 但不在 JTextArea 中 我已将 JTextArea 的字体设置为与 J
  • 如何远程在BitBucket上创建存储库?

    我想在 Bitbucket 上使用 hg 命令从本地计算机创建存储库 而不是在 Bitbucket 上手动创建存储库 是否可以 我通过curl 命令使用REST API 执行了以下操作 gt curl k X POST user user
  • 如何正确确定Intel处理器的-march和-mtune?

    我目前正在从源代码构建一个对我来说性能至关重要的软件 因此 我想对其进行优化 以便在我的特定 Intel CPU 上运行 构建过程要求我设置 march 和 mtune 标志 如果在我的处理器节点上我使用 gcc march native
  • 使用QThread定期更新一个QTableWidget pyqt

    在我的应用程序中 我使用 API 调用获取记录 然后将数据动态添加到 QTableWidget 这是到目前为止我的代码片段 class TriageUI QtGui QMainWindow def init self QtGui QMain
  • 使用并发.futures 中的 ThreadPoolExecutor 时的 max_workers 数量?

    在决定从并发 futures 中将 ThreadPoolExecutor 中的 max workers 设置为什么时需要考虑哪些因素 只要您期望 Python 3 5 可用 是否有任何理由不将 max workers 设置为 None 然后
  • 找到所有潜在最长序列的Pythonic方法

    所以 我有一个如下所示的列表 potential labels foo foo bar foo bar baz abc abc cde def bleh The desired output foo bar baz abc cde def
  • 使用令牌身份验证的 Java HTTP 请求

    我正在尝试向我正在运行的本地服务器发出 GET 请求 我无法返回正确的数据 我看到 未经授权 的响应 鉴于字符串 令牌 是正确的 任何人都可以发现任何明显的问题吗 protected Object doInBackground Void p
  • ClientError:调用 HeadObject 操作时发生错误 (403):禁止

    我正在创建一个 AWS Lambda 函数 尝试将文件 s3 download file 下载到我使用以下命令创建的临时目录tempfile来自 Python 3 6 的库 然后 我对文件进行一些转换 并且需要再次上传它 s3 upload
  • 访问自动属性中的支持字段

    有什么方法可以访问属性的支持字段以进行验证 更改跟踪等 像下面这样的事情可能吗 如果没有 是否有计划将其纳入 NET 4 C 4 public string Name get set if value
  • Oracle 中的第 N 个最高薪水

    为了找出oracle中的第N个最大sal 我使用下面的查询 SELECT DISTINCE sal FROM emp a WHERE SELECT COUNT DISTINCE sal FROM emp b WHERE a sal lt b
  • `$eq` 运算符是否适用于数组点表示法?

    我正在尝试编写一个聚合查询 expr inside lookup s match管道阶段 我发现了一些与数组点表示法相关的问题 想象一个集合relations数组字段称为nodes 以下查询可以正常返回正确的结果 db relations
  • 预防孤儿

    我试图通过在段落和标题内的最后两个单词之间添加不间断空格来防止出现单个单词孤儿 然而 我正在使用的脚本也有删除链接的副作用 p h1 h2 h3 h4 h5 h6 each function var wordArray this text
  • 一个模拟键盘按下的程序

    我是编程新手 我想编写一个程序 仅供自用 每次运行时都会重复一组预设的键盘操作 有人可以给我一些建议吗 是否有任何应用程序可以做到这一点 有各种各样的程序可以满足您的需求 如果你在 Windows 上 自动热键 http www autoh
  • jmeter恒定视频流

    我正在使用 Jmeter 来加载测试视频流 我可以传递登录信息 但我需要让 Jmeter 在提供视频流的页面上 保持 我怎样才能做到这一点 我已经设置了 cookie 管理器 如果视频流不在您的服务器上 您根本不需要测试它 例如 如果您的网
  • 本地化系统生成的隐私警报消息 iOS UIAlertView Xcode

    我正在使用 Xcode Swift 1 1 开发一个应用程序 并使用 iOS 7 1 和 iOS 8 1 模拟器对其进行测试 该应用程序允许用户访问他们的照片库 但在此之前 iOS 会显示隐私警报消息标题 以英语请求用户许可 App Nam
  • 使用 SearchView android studio 工具栏中的左侧空间

    我正在尝试添加一个简单的SearchView到我的应用程序中的工具栏 除了布局之外 一切都工作正常 之间有这个 空间 NavigationDrawer图标和SearchView 如果我设置了标题 则空间将填充该字符串 否则为空 空字符串 标
  • 简化平面数组或多维数组的循环

    通常 我会有一个数组来保存一组值 每个值我都需要处理 有时 数组仅保存单个集合 在这种情况下 每个值都需要经过该过程 其他时候 数组将保存许多集合 在这种情况下 每个值都将是一个数组 并且这些数组中的每个值都需要进行处理 这是一个例子 fo
  • 使用 MVVM 动态添加时给予 TabItem 焦点

    所有 我添加一个TabItem to a TabControl动态地使用 MVVM 新的TabItems加载良好 但我希望添加的选项卡自动获得焦点 也就是说 我添加了一个选项卡 但我不想必须单击该选项卡才能获得焦点 XAML 的TabCon
  • 如何将 CSS 样式仅应用于文本

    我正在尝试将样式应用于 HTML 文本之类的内容 我想要的基本上是 我得到的基本上是 正如您所看到的 第一行是缩进的 但其他行没有缩进 到目前为止 我已经将文本包含在 span 它嵌套在一个 div slide text text back
  • 作为 Windows 服务运行时,.Net Core 6 Worker Service 不写入日志

    我使用 C Net Core 6 Visual Studio 2022 创建了一个辅助服务 如果通过 Visual Studio 运行或直接从 Windows 资源管理器 PowerShell 启动 它会按预期写入日志文件 但是 当作为 W