如何将日志从 T-SQL 程序发送到 GrayLog?

How to send logs to GrayLog from T-SQL procedures?

我可以使用 log4net+GELF appender 从 C# 应用程序将日志发送到日志收集器。

但是如何将日志从T-SQL程序发送到GrayLog? 有代码:

  1. WinForms 应用程序工作正常,我 运行 它在安装 SQL 服务器的同一台机器上。我在 GrayLog 中看到收到的所有日志:

    private void button1_Click(object sender, EventArgs e) { 字符串设施=“DoBeDo”; string host = "我的主机名"; 内部端口 = 12201;

             try
             {
                 using (var logger = new GrayLogUdpClient(facility, host, port))
                 {
                     logger.Send("Hello", "Jonny Holiday", new { Username = "John", Email = "jonny@example.com" });
                 }
             }
             catch(Exception xx)
             {
                 Console.WriteLine("***Exception:{0}", xx.Message);
             }
         }
    
  2. 有 SQLCLR 代码,它有效,我在 SSMS 中看到消息,但在 GrayLog 中没有任何记录,也没有任何异常:

    public 部分 class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void SqlSPHelper(SqlString msg) { 尝试 { SqlContext.Pipe.Send(@"SqlSPHelper::启动"); 字符串设施=“DoBeDo”; string host = "我的主机名"; 内部端口 = 12201;

             try
             {
                 using (var logger = new GrayLogUdpClient(facility, host, port))
                 {
                     logger.Send("Hey", "Donny Hooligan", new { Username = "Donald", Email = "Donny@example.com" });
                 }
             }
             catch (Exception xx)
             {
                 Console.WriteLine("***Exception:{0}", xx.Message);
             }
         }
         catch(Exception xx)
         {
             SqlContext.Pipe.Send("1:"+xx.Message);
         }
         SqlContext.Pipe.Send(@"SqlSPHelper:: Completed");
     }
    

怎么了?如何将日志发送到GrayLog?

我认为您可以通过以下几种方式做到这一点:

  1. 定义一个 CLR 存储过程,它执行日志记录部分
  2. 在存储过程的 CATCH 块中,RAISERROR WITH LOG 写入 Windows 事件查看器和 SQL 服务器错误日志。稍后您可以从 GrayLog 中的事件查看器中过滤和读取这些事件。

第一种方法更好,因为它更干净。第二种方法使 SQL 服务器错误日志有很多日志条目,这会导致 DBA 团队误报。