开Zlog源代码使用的是pthread_rwlock_t线程读写锁,怎么能够保证多进程同时调用呢,谢谢

发布于 2021-11-13 11:44:48 字数 101 浏览 964 评论 16

开Zlog源代码使用的是pthread_rwlock_t线程读写锁,怎么能够保证多进程同时调用呢,谢谢

看源代码中使用的都是线程级别的锁,怎么能够保证多进程访问呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(16

月亮是我掰弯的 2021-11-18 17:11:37

辛苦了,代码问题吗,对于单个应用程序使用一个log文件应该没问题吧

居里长安 2021-11-18 17:11:37

刚把代码发上git,可以试试看,性能有一定的下降,但保证正确

https://github.com/HardySimpson/zlog/archive/master.zip

眼眸 2021-11-18 17:11:37

好的,我测试一下,幸苦了!!!

瑾兮 2021-11-18 17:11:34

知道问题在哪里了,我想想怎么解决

凡尘雨 2021-11-18 17:11:34

对,单进程一个是可以的

够钟 2021-11-18 17:11:10

测试代码如下:

#include <stdio.h>
#include "zlog.h"
#include <pthread.h>

zlog_category_t *g_zc;

void *second_Cntevent_pth(void *arg)
{
    printf("PID@%s pid is %dn",__FUNCTION__,getpid());

	while(1)
	{
        zlog_info(g_zc, "second_Cntevent_pthggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggsggggggggggggggggggggggggh");
        sleep(10);
	}
}

void *second_Cntevent1_pth(void *arg)
{
    printf("PID@%s pid is %dn",__FUNCTION__,getpid());

	while(1)
	{
        zlog_info(g_zc, "second_Cntevent_pthFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB");
        sleep(10);
	}
}
int main(int argc, char** argv)
{
	int rc;
    int iRet = 0;

    pthread_t  Bzq_pthid;

	rc = zlog_init("test_hello.conf");
	if (rc) {
		printf("init failedn");
		return -1;
	}

	g_zc = zlog_get_category("my_cat");
	if (!g_zc) {
		printf("get cat failn");
		zlog_fini();
		return -2;
	}

	zlog_info(g_zc, "hello, zlog");

    iRet = pthread_create(&Bzq_pthid, NULL, second_Cntevent_pth, NULL);
    if (0 != iRet)
    {
        printf("Creat second_Cntevent_pth failn");
    }

    iRet = pthread_create(&Bzq_pthid, NULL, second_Cntevent1_pth, NULL);
    if (0 != iRet)
    {
        printf("Creat second_Cntevent_pth failn");
    }

    while (1)
    {
        sleep(1);
    }
	zlog_fini();

	return 0;
}

测试配置文件如下:

[global]
#改变量可以不写,默认是true,如果使用设置为true时,Zlog就会严格检查所用格式和规则,否则,忽略所用格式和规则。
strict init = true
buffer min = 1024
buffer max = 2048
#转档指定锁文件,用于保证多进程下日志安全转档,使用默认的配置文件为锁文件。
#rotate lock file = zlog.lock
#日志访问权限,600 只允许当前用户访问
file perms = 600
[formats]
#使用默认日志输出格式  "%d %V [%p %F %L] %m%n" 输出日志格式为:%-5V按照日志级别按照左对齐
#2012-12-13 10:23:29 INFO [31668:test_hello.c:41] hello, zlog  
simple	= "%d.%-8.8us %-5V [%-8.8p.%-8.8t %F %L] %m%n"
#simple	= "%d.%ms %m%n"
#simple2	= "%d.%us %m%n"

[rules]
#优先级从低到高 debug info notice warn fatal  debug大于等于debug的优先级都能给通过debug输出。
my_cat.*		>stderr;
#当hello.txt文件大小大于10MB时,会将hello.txt->hello.txt.0 0代表不删除任何文件
my_cat.INFO		"hello.txt",10kb * 3 ~ "hello.txt.#r";simple
#my_cat.INFO		"hello.txt",1MB ~ "hello-%d(%Y%m%d).#2s.txt";simple
#my_cat.INFO		"hello.txt",1MB;simple
#my_cat.INFO		"hello.txt",1MB;simple

 

无声静候 2021-11-18 17:11:10

尝试了一下,没发现问题……把你的测试代码稍微改了一下,10秒才输出一次日志太慢了

/*
 * This file is part of the zlog Library.
 *
 * Copyright (C) 2011 by Hardy Simpson <HardySimpson@gmail.com>
 *
 * The zlog Library is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * The zlog Library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with the zlog Library. If not, see <http://www.gnu.org/licenses/>.
 */
#include <stdio.h>
#include "zlog.h"
#include <pthread.h>
       #include <sys/types.h>
       #include <unistd.h>

zlog_category_t *g_zc;

void *second_Cntevent_pth(void *arg)
{
	int j = 10;
    printf("PID@%s pid is %dn",__FUNCTION__,getpid());

	while(j--)
	{
        zlog_info(g_zc, "second_Cntevent_pthggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggsggggggggggggggggggggggggh");
        //sleep(1);
	}
	return NULL;
}

void *second_Cntevent1_pth(void *arg)
{
	int j = 10;
    printf("PID@%s pid is %dn",__FUNCTION__,getpid());

	while(j--)
	{
        zlog_info(g_zc, "second_Cntevent_pthFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB");
        //sleep(1);
	}
	return NULL;
}
int main(int argc, char** argv)
{
	int rc;
    int iRet = 0;

    pthread_t  Bzq_pthid1;
    pthread_t  Bzq_pthid2;

	rc = zlog_init("test_tmp.conf");
	if (rc) {
		printf("init failedn");
		return -1;
	}

	g_zc = zlog_get_category("my_cat");
	if (!g_zc) {
		printf("get cat failn");
		zlog_fini();
		return -2;
	}

	//zlog_info(g_zc, "hello, zlog");

    iRet = pthread_create(&Bzq_pthid1, NULL, second_Cntevent_pth, NULL);
    if (0 != iRet)
    {
        printf("Creat second_Cntevent_pth failn");
    }

    iRet = pthread_create(&Bzq_pthid2, NULL, second_Cntevent1_pth, NULL);
    if (0 != iRet)
    {
        printf("Creat second_Cntevent_pth failn");
    }

	pthread_join(Bzq_pthid1, NULL);
	pthread_join(Bzq_pthid2, NULL);

	zlog_fini();

	return 0;
}

配置文件是一样的

第一次执行,结果是

$ ls -lh hello.txt 
-rw------- 1 kent kent 3.5K 2013-01-03 16:08 hello.txt

第二次执行是

$ ls -lh hello.txt 
-rw------- 1 kent kent 6.9K 2013-01-03 16:09 hello.txt

第三次执行是,可以看到刚好转档到地一个文件

$ ls -lh hello.txt*
-rw------- 1 kent kent   0 2013-01-03 16:09 hello.txt
-rw------- 1 kent kent 11K 2013-01-03 16:09 hello.txt.0

第四次执行是

$ ls -lh hello.txt*
-rw------- 1 kent kent 3.5K 2013-01-03 16:13 hello.txt
-rw------- 1 kent kent  11K 2013-01-03 16:13 hello.txt.0

继续

$ ls -lh hello.txt*
-rw------- 1 kent kent 6.9K 2013-01-03 16:14 hello.txt
-rw------- 1 kent kent  11K 2013-01-03 16:13 hello.txt.0

一直没观察到问题。。。

悸初 2021-11-18 17:11:06

可能我表达有误,我当时测试环境不是一个应用程序的里面使用多进程写文件。而是同一个应用程序,重复启动了两次,结果进行日志转档时,旧的文件大小仍旧在增加。

柠檬 2021-11-18 17:09:58

这应该也没问题,每次写日志的时候都会去检测文件大小,和进程起了几次没关系。

酷到爆炸 2021-11-18 17:09:54

手工写了一个多进程的测了一下,没问题。你的程序能也贴下么?

墨洒年华 2021-11-18 16:56:11

配置规则如下:
[global]
#改变量可以不写,默认是true,如果使用设置为true时,Zlog就会严格检查所用格式和规则,否则,忽略所用格式和规则。
strict init = true
buffer min = 1024
buffer max = 2048
#转档指定锁文件,用于保证多进程下日志安全转档,使用默认的配置文件为锁文件。

#日志访问权限,600 只允许当前用户访问
file perms = 600
[formats]
#使用默认日志输出格式  "%d %V [%p %F %L] %m%n" 输出日志格式为:%-5V按照日志级别按照左对齐
#2012-12-13 10:23:29 INFO [31668:test_hello.c:41] hello, zlog 
simple = "%d.%-8.8us %-5V [%-8.8p.%-8.8t %F %L] %m%n"

[rules]
#优先级从低到高 debug info notice warn fatal  debug大于等于debug的优先级都能给通过debug输出。
my_cat.*  >stderr;
#当hello.txt文件大小大于1MB时,会将hello.txt->hello.txt.0 0代表不删除任何文件
my_cat.INFO  "hello.txt",1MB * 3 ~ "hello.txt.#r";simple

帮忙看一下那个地方有错误,谢谢了。在linux下,打开多个应用程序时,文档转档功能就不正常了。

奈何桥上唱咆哮 2021-11-18 16:35:54
  1. pthread_rwlock_t zlog_env_lock这个锁,是为了一个进程中多个线程用的,每个进程的确会创建自己的读写锁
  2. 线程安全就是指一个进程内的多个线程同时初始化、写日志、重载配置是线程安全的。
  3. 多进程写一个日志文件并转档是支持的、但是不会非常的精确。可以贴一下你具体的配置看一下。
像你 2021-11-18 15:44:31

谢谢,但看初始化代码时,创建的都是pthread_rwlock_t zlog_env_lock 线程级别的读写锁,当多个进程都调用初始化函数时,岂不是每个进程都创建了各自的读写锁??

筱武穆 2021-11-18 08:18:48

难易兄,在查看用户手册时,提到所用API函数接口都是线程安全的,是什么意思呢?在多个进程该怎么使用呢?会不会产生不安全因素呢?

奢望 2021-11-18 06:55:45

难易兄,我这边测试Zlog,发现不同程序(即不同应用程序)写同一个日志文件时,发现文档转存时,旧的文件大小还在不断增加。但同一个应用程序不同线程使用时没有出现问题,日志转存正常。是不是Zlog不支持多应用程序写同一个文件的情况?谢谢了

拍不死你 2021-11-17 06:36:51

你说的是多进程写一个文件的原子性吗?

多进程写文件的原子性由write()这个系统调用保证,只要打开文件描述符用O_APPEND模式打开,单个write() 就是原子的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文