int main(int argc, char *argv[]) { if (argc != 3) error(1, errno, "Usage: %s ip port", argv[0]); struct sockaddr_in log_addr; memset(&log_addr, 0, sizeof(log_addr)); log_addr.sin_family = AF_INET; if (inet_aton(argv[1], &log_addr.sin_addr) == 0) error(1, errno, "ip: %s in invalid", argv[1]); log_addr.sin_port = htons((unsigned short)atoi(argv[2])); dlog_t *lp = dlog_init((char *)&log_addr, DLOG_REMOTE_LOG, 0, 0, 0); if (lp == NULL) error(1, errno, "dlog_init fail"); int i; for (i = 0; i < 100 * 10000; ++i) { dlog(lp, "hello worldddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd000"); if ((i % 1000) == 0) usleep(500 * 1000); } return 0; }
static int init_log(void) { default_dlog = dlog_init(settings.log.path, settings.log.shift, settings.log.max, settings.log.num, settings.log.keep); if (default_dlog == NULL) return -__LINE__; default_dlog_flag = dlog_read_flag(settings.log.flag); if (alert_init(&settings.alert) < 0) return -__LINE__; return 0; }
int main(int argc, char *argv[]) { if (argc == 1) { print_help(); exit(1); } opterr = 1; int option_index = 0; struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"base", required_argument, NULL, 'b'}, {"type", required_argument, NULL, 't'}, {"size", required_argument, NULL, 's'}, {"num", required_argument, NULL, 'n'}, {"keep", required_argument, NULL, 'k'}, {"port", required_argument, NULL, 'p'}, {"addr", no_argument, NULL, 'a'}, {"daemon", no_argument, NULL, 'd'}, {0, 0, 0, 0}, }; char *base_name = NULL; int shift_type = 0; size_t max_size = 0; int log_num = 0; int keep_time = 0; int port = 0; bool log_addr = 0; bool in_daemon = 0; int c; while ((c = getopt_long(argc, argv, "hb:t:s:n:k:p:ad", long_options, &option_index)) != -1) { switch (c) { case 'h': print_help(); exit(0); case 'b': base_name = strdup(optarg); break; case 't': if ((shift_type = strtotype(optarg)) < 0) error(1, 0, "invalid shift type"); break; case 's': max_size = strtoull(optarg, NULL, 0); break; case 'n': log_num = atoi(optarg); break; case 'k': keep_time = atoi(optarg); break; case 'p': port = atoi(optarg); break; case 'a': log_addr = true; break; case 'd': in_daemon = true; break; case '?': exit(EXIT_FAILURE); default: abort(); } } if (base_name == NULL) error(1, errno, "-b --base base_name is required"); if (port == 0) error(1, errno, "-p --port port is required"); if (shift_type == 0) shift_type = DLOG_SHIFT_BY_DAY; if (in_daemon) daemon(true, true); dlog_t *lp = dlog_init(base_name, shift_type | DLOG_USE_FORK, max_size, log_num, keep_time); if (lp == NULL) error(1, errno, "dlog_init fail"); int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) error(1, errno, "create socket fail"); struct sockaddr_in server; bzero(&server, sizeof(server)); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons((uint16_t)port); if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0) error(1, errno, "bind fail"); running = 1; signal(SIGQUIT, sig_handle); signal(SIGCHLD, SIG_IGN); while (running) { fd_set r_set; FD_ZERO(&r_set); FD_SET(sockfd, &r_set); int ret = select(sockfd + 1, &r_set, NULL, NULL, NULL); if (ret > 0 && FD_ISSET(sockfd, &r_set)) { struct sockaddr_in client; socklen_t len = sizeof(client); char buf[UINT16_MAX]; ssize_t n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&client, &len); if (n < 0) continue; dlog_server(lp, buf, n, log_addr ? &client : NULL); } } return 0; }