ZBLOG

Glog如何给支持远程日志发送

要让 Google Glog(glog) 支持远程日志发送,需要扩展其默认的本地文件输出功能。以下是几种实现方案:


方案1:自定义 LogSink 实现远程传输

Glog 允许通过继承 google::LogSink 类自定义日志输出目标。以下是基于 TCP Socket 的示例:

步骤1:实现自定义 LogSink

#include <glog/logging.h>
#include <sys/socket.h>
#include <arpa/inet.h>

class RemoteLogSink : public google::LogSink {
public:
    RemoteLogSink(const std::string& server_ip, int port) {
        sockfd_ = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in serv_addr;
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(port);
        inet_pton(AF_INET, server_ip.c_str(), &serv_addr.sin_addr);
        
        if (connect(sockfd_, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) {
            LOG(ERROR) << "Failed to connect to remote log server";
        }
    }

    ~RemoteLogSink() { close(sockfd_); }

    void send(const std::string& message) override {
        ::send(sockfd_, message.c_str(), message.size(), 0);
    }

private:
    int sockfd_;
};

步骤2:注册 Sink 并测试

int main(int argc, char* argv[]) {
    google::InitGoogleLogging(argv[0]);
    
    // 注册远程日志Sink(替换为你的服务器IP和端口)
    auto remote_sink = new RemoteLogSink("192.168.1.100", 5140);
    google::AddLogSink(remote_sink);

    LOG(INFO) << "This log will be sent to remote server!";
    
    google::ShutdownGoogleLogging();
    return 0;
}

方案2:结合第三方工具转发

如果不想修改代码,可以通过以下方式间接实现远程日志:

(1)Tail + Fluentd/Vector

  • Glog 写入本地文件 → 用 tail -finotify 监控文件变化 → 通过 Fluentd/Vector 转发到远端。
  • 优点:无需修改程序,适合生产环境。

(2)rsyslog/syslog-ng

  • Glog 输出到系统日志 → 配置 rsyslog/syslog-ng 的远程转发规则。
  • 配置示例(rsyslog.conf):
    
    *.* @192.168.1.100:514   # UDP传输
    *.* @@192.168.1.100:514  # TCP传输
    

方案3:集成开源协议(如 gRPC/HTTP)

若需高性能或加密传输,可集成 gRPC/HTTP:

// gRPC示例(需.proto定义日志服务)
void LogViaGRPC(const std::string& message) {
    auto channel = grpc::CreateChannel("logs.example.com:50051", grpc::InsecureChannelCredentials());
    auto stub = LogService::NewStub(channel);
    
    LogRequest request;
    request.set_message(message);
    
    stub->SendLog(nullptr, request, nullptr);
}

send()方法中调用此函数即可。


性能与可靠性建议

问题 解决方案
网络延迟 Async logging + Buffer(如 Boost.Asio)
断网重连 Automatic retry + Local cache
安全性 TLS加密(gRPC/HTTPS)

完整项目参考

如果需要更具体的实现细节(如异步队列或Kafka集成),可以进一步讨论!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8036

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?