WCF服务-记录调用方详细信息

本文关键字:详细信息 调用 记录 服务 WCF | 更新日期: 2023-09-27 17:59:24

我创建了一个Windows服务(.Net 4.0),它通过TCP绑定公开WCF服务端点。

当调用服务方法时,它将在单独的线程中执行多个任务。执行操作的每个类都注入了Log4Net-ILog实现(使用依赖项注入)。

我想做的是每个日志条目都有调用者的IP地址,这样我就可以通过服务器跟踪呼叫或识别哪个呼叫出错了。

使用log4Net的LogicalThreadContext,我已经成功地为在同一线程上编写的任何日志消息实现了这一点,但不为其他线程上的任何消息实现。

下面的示例代码。

服务接口:

    [ServiceContract(Namespace = "http://tremac")]
    public interface IBroadcastService
    {
        [OperationContract]
        void PublishMessage(Message message);
    }

服务实施:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class BroadcastService: IBroadcastService
{
    private readonly ILog _logger;

    public BroadcastService(ILog logger)
    {
        _logger = logger;
        _logger.Debug("Broadcast Service Initiated");
    }
    public void PublishMessage(Message message)
    {

        var prop =
                OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as
                    RemoteEndpointMessageProperty;
        string ip = prop == null ? "" : prop.Address;
        log4net.LogicalThreadContext.Properties["CallerIp"] = ip;
        try
        {
            _logger.Info("Publishing message from " + message.Sender);
            var sinks = ObjectFactory.GetAllInstances<IMessageWriteRepository>();
            Parallel.ForEach(sinks, x => x.SaveMessage(message));
            _logger.Info("Message published");
        }
        catch (Exception ex)
        {
            _logger.Error("Issue publishing message from " + message.Sender + " on " + ip, ex);
            throw new FaultException("Message was either not published or only partially published. Please contact support");
        }
    }
}

请注意Parallel.Foreach的使用,这里有几个并行使用的IMessageWriteRepository实现。每个实现都有一个通过依赖注入注入的ILog。在这一点上,调用方的上下文似乎丢失了。

我的Log4Net附加程序中的模式布局如下:

    <conversionPattern value="%date [%-5level] [%thread] [%class] [%property{CallerIp}] %message%newline" />

最后,生成的日志如下所示:

    2015-06-23 09:49:11,004 [INFO ] [13] [BroadcastService] [127.0.0.1] Publishing message from Graeme on 127.0.0.1
    2015-06-23 09:49:11,073 [INFO ] [13] [RabbitMqMessageWriter] [(null)] Sending message on topic TestTopic
    2015-06-23 09:49:11,073 [INFO ] [15] [DatabaseAndFileshareWriteMessageRepository] [(null)] Saving message body to disk
    2015-06-23 09:49:11,104 [INFO ] [15] [DatabaseAndFileshareWriteMessageRepository] [(null)] Saving message meta to database
    2015-06-23 09:49:11,737 [INFO ] [13] [BroadcastService] [127.0.0.1] Message published

请注意不同线程的日志消息中调用方IP应位于的[(null)]。

欢迎提出任何建议。

WCF服务-记录调用方详细信息

由于log4net LogicalThreadContext无法工作。

以下代码将在升级到log4net版本1.12.13.0 后跨线程工作

log4net.LogicalThreadContext.Properties["CallerIp"] = ip;