Windows-Service中的Serilog不写入日志文件

时间:2014-10-26 10:57:40

标签: windows-services topshelf serilog

我在TopShelf服务中使用Serilog,登录到控制台和滚动文件。在控制台中运行服务时,我的消息将写入日志文件,但是当我安装服务并运行它时,不会发生日志记录。我需要配置什么特别的东西吗?该文件将写入"。\ logs \ log- {date} .txt"下的二进制文件夹。

祝你好运 Gope

7 个答案:

答案 0 :(得分:21)

我有一个非常类似的问题。就我而言,问题在于相对路径。 我只需要指定绝对路径。现在它就像一个魅力。

WriteTo.RollingFile(AppDomain.CurrentDomain.BaseDirectory + "\\logs\\log-{Date}.log")

希望它有所帮助!

答案 1 :(得分:10)

我们遇到了同样的问题,这就是我们发现的:

  • Serilog配置为滚动日志文件并写入Seq
  • 已启用可销售日志。

<强>症状   - 没有创建日志文件   - 没有日志写入Seq。

根据@ gdoten的评论,我们的日志文件写入\ windows \ syswow64(服务作为localservice运行)。
我们认为这些文件的权限可能不允许读取持久的假脱机文件,导致没有日志写入Seq。

修复是硬编码rollinglogfile和缓冲区的路径。

答案 2 :(得分:7)

props: {
        item: null
    },

尝试这个,它在我的ASP.NET核心2应用程序中作为Windows服务运行

答案 3 :(得分:3)

运行服务的帐户很可能缺少写入日志文件位置的权限。尝试将日志文件位置更改为系统的临时文件夹,以查看是否是这种情况。

如果仍然失败,使用Serilog的SelfLog获取异常信息是最好的选择。

答案 4 :(得分:0)

我正在作为Windows服务运行,这是我的json文件。

{
    "Serilog": {
        "MinimumLevel": "Debug",
        "WriteTo": [
          {
            "Name": "RollingFile",
            "Args": {
              "pathFormat": "C:\\Program Files\\mycomp\\myapp\\logs\\log-{Date}.txt"
          }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "WithEnvironmentUserName", "WithProcessId" ],
    "Properties": {
      "Application": "MyApp",
      "Environment": "Development"
}

} }

-吉娜

答案 5 :(得分:0)

我遇到了类似的问题,它最终由于以下代码

public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile(AppDomain.CurrentDomain.BaseDirectory + "\\appsettings.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();

该代码指定appsettings.json文件,并且在该文件中具有serilog的配置设置,但是在运行中运行时,当前文件夹未指向可执行文件文件夹。因此它找不到文件appsettings.json,然后serilog当然不会按预期工作。

只需更改代码即可,如下所示

  public static List<InvoiceModel> CustomerInvoices(Dictionary<string, string> pVal)
    {
        List<InvoiceModel> UserInvoices = new List<InvoiceModel>();

        string sQuery = "SELECT * from pctn_invoices WHERE INV_CustID = " + pVal;

        MySqlConnection m_connection = new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
        if (m_connection.State == ConnectionState.Open) m_connection.Close();
        MySqlCommand myCommand = new MySqlCommand(sQuery);
        myCommand.Connection = m_connection;
        m_connection.Open();
        MySqlDataReader sRet = myCommand.ExecuteReader();
        while (sRet.Read())
        {
            InvoiceModel UserInvoice = new InvoiceModel();
            UserInvoice.m_ID = sRet["ID"].ToString();
            UserInvoice.m_CustomerID = sRet["INV_CustID"].ToString();
            UserInvoice.m_Description = sRet["INV_Description"].ToString();
            UserInvoice.m_Total = sRet["INV_Total"].ToString();
            UserInvoices.Add(UserInvoice);
        }
        m_connection.Close();
        return UserInvoices;

    }

答案 6 :(得分:0)

您还可以使用类似的方法(当您要创建Windows服务和Serilog时):

var builder = new ConfigurationBuilder()
           .AddJsonFile($@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}\appsettings.json", optional: true, reloadOnChange: true)
           .AddEnvironmentVariables();