因为项目原因需要集中记录各终端的日志,而且需要将各终端的日志分目录存放。
各终端记录日志的问题大家可以百度,这里是用的配置文件实现的文件,格式,过滤器配置。本文主要说明服务端的功能,但是附件的代码包中的log4cplus库+头文件可以编译出客户端代码。
为实现上述功能,首先需要解决server端识别客户端的问题,但是log4cpus源码中没有实现客户端的ip获取,所以需要自己实现。
关键代码如下(本文基于log4Cplus1.0.3-rc9,代码包请到csdn下载资源中搜索资源:“使用log4cplus实现的分目录存放日志服务器完整工程”):
1 修改socket.h暴露原本保护的成员,并新增一个接口acceptSocket2以获取客户端的ip。
// Module: Log4CPLUS
// File: socket.h
// Created: 4/2003
// Author: Tad E. Smith
//
//
// Copyright (C) Tad E. Smith All rights reserved.
//
// This software is published under the terms of the Apache Software
// License version 1.1, a copy of which has been included with this
// distribution in the LICENSE.APL file.
//
/** @file */
#ifndef LOG4CPLUS_HELPERS_SOCKET_HEADER_
#define LOG4CPLUS_HELPERS_SOCKET_HEADER_
#include <log4cplus/config.hxx>
#include <log4cplus/tstring.h>
#include <log4cplus/helpers/socketbuffer.h>
#if defined(_WIN32)
#include <winsock.h>
#endif
namespace log4cplus {
namespace helpers {
enum SocketState { ok,
not_opened,
bad_address,
connection_failed,
broken_pipe,
invalid_access_mode,
message_truncated
};
#if !defined(_WIN32)
typedef int SOCKET_TYPE;
#define INVALID_SOCKET -1
#else
typedef SOCKET SOCKET_TYPE;
#endif
class LOG4CPLUS_EXPORT AbstractSocket {
public:
// ctor and dtor
AbstractSocket();
AbstractSocket(SOCKET_TYPE sock, SocketState state, int err);
AbstractSocket(const AbstractSocket&);
virtual ~AbstractSocket() = 0;
// methods