ZBLOG

使用glog实现本地记录文件的同时支持远程发送,用win下的udp

以下是一个基于 glog(Google Logging Library)的示例代码,结合 Windows UDP Socket 实现本地日志记录的同时支持远程发送日志的功能。

功能说明

  1. 本地日志:使用 glog 记录到文件。
  2. 远程日志:通过 UDP 发送日志到指定的服务器。

完整代码

  1. #include <winsock2.h>
  2. #include <ws2tcpip.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <glog/logging.h>
  6. #pragma comment(lib, "ws2_32.lib")
  7. class UDPLogger {
  8. public:
  9. UDPLogger(const std::string& remote_ip, int remote_port) : remote_ip_(remote_ip), remote_port_(remote_port) {
  10. WSADATA wsaData;
  11. if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
  12. LOG(ERROR) << "Failed to initialize Winsock";
  13. return;
  14. }
  15. sock_ = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  16. if (sock_ == INVALID_SOCKET) {
  17. LOG(ERROR) << "Failed to create socket: " << WSAGetLastError();
  18. WSACleanup();
  19. return;
  20. }
  21. memset(&server_addr_, 0, sizeof(server_addr_));
  22. server_addr_.sin_family = AF_INET;
  23. server_addr_.sin_port = htons(remote_port_);
  24. inet_pton(AF_INET, remote_ip_.c_str(), &server_addr_.sin_addr);
  25. }
  26. ~UDPLogger() {
  27. if (sock_ != INVALID_SOCKET)
  28. closesocket(sock_);
  29. WSACleanup();
  30. }
  31. void SendLog(const std::string& log_msg) {
  32. if (sendto(sock_, log_msg.c_str(), log_msg.size(), 0,
  33. (struct sockaddr*)&server_addr_, sizeof(server_addr_)) == SOCKET_ERROR) {
  34. LOG(WARNING) << "Failed to send log via UDP: " << WSAGetLastError();
  35. }
  36. }
  37. private:
  38. SOCKET sock_{INVALID_SOCKET};
  39. struct sockaddr_in server_addr_;
  40. std::string remote_ip_;
  41. int remote_port_;
  42. };
  43. // Custom Google Log sink to send logs via UDP
  44. class RemoteLogSink : public google::LogSink {
  45. public:
  46. explicit RemoteLogSink(UDPLogger* udp_logger) : udp_logger_(udp_logger) {}
  47. void send(google::LogSeverity severity, const char* full_filename,
  48. const char* base_filename, int line,
  49. const struct ::tm* tm_time,
  50. const char* message, size_t message_len) override {
  51. // Format the log message
  52. std::ostringstream oss;
  53. oss << google::GetLogSeverityName(severity)
  54. << " [" << base_filename << ":" << line << "] "
  55. << message;
  56. // Send via UDP
  57. udp_logger_->SendLog(oss.str());
  58. }
  59. private:
  60. UDPLogger* udp_logger_;
  61. };
  62. int main(int argc, char* argv[]) {
  63. // Initialize glog
  64. google::InitGoogleLogging(argv[0]);
  65. // Local file logging
  66. FLAGS_log_dir = "./logs"; // Log directory
  67. FLAGS_minloglevel = google::INFO; // Minimum log level
  68. // Initialize UDP logger for remote logging
  69. UDPLogger udp_logger("127.0.0.1", 514); // Replace with your server IP and port
  70. // Add custom sink for sending logs remotely
  71. RemoteLogSink remote_sink(&udp_logger);
  72. #if defined(GLOG_CUSTOM_PREFIX_SUPPORT)
  73. #else
  74. #define GLOG_CUSTOM_PREFIX_SUPPORT 1 // Ensure custom prefix is supported in older glog versions
  75. #endif
  76. #if GLOG_CUSTOM_PREFIX_SUPPORT > 0
  77. google::AddLogSink(&remote_sink); // Register our custom sink
  78. #endif
  79. LOG(INFO) << "This is an INFO log.";
  80. LOG(WARNING) << "This is a WARNING log.";
  81. LOG(ERROR) << "This is an ERROR log.";
  82. google::ShutdownGoogleLogging();
  83. return EXIT_SUCCESS;
  84. }

关键点解析

  1. UDPLogger

    • 封装了 Windows Socket (Winsock2) ,用于发送 UDP 数据包。
    • SendLog():将日志内容发送到指定服务器。
  2. RemoteLogSink

    • 继承自 google::LogSink,自定义日志输出方式。
    • send()方法:格式化日志并调用 UDPLogger.SendLog()
  3. 主程序逻辑

    • google::InitGoogleLogging():初始化 glog。
    • FLAGS_log_dir="./logs":设置本地日志存储目录。
    • google::AddLogSink(&remote_sink):注册自定义的远程日志处理器。
  4. 编译运行

    1. g++ main.cpp -lglog -lws2_32 -o app.exe && ./app.exe

适用场景

  • ✅ Windows平台下的C++服务端开发
  • ✅ Glog + UDP远程日志收集(如 ELK、Graylog、Syslog)
  • ✅ Debug/Release环境统一管理

如果需要更稳定的传输(如 TCP),可以改用 Boost.Asio/WinHTTP。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?