精华内容
下载资源
问答
  • Linux 日志输出控制

    千次阅读 2016-11-10 21:45:19
    在嵌入式Linux设备中,系统资源比较有限,在产品开发时我们会打印很日志信息方便工程调试和问题定位。但是在产品发布的时候,为了节省系统资源,那些调试信息或是一些不总要的信息就不需要再记入到日志当中,...

        在嵌入式Linux设备中,系统资源比较有限,在产品开发时我们会打印很多的日志信息方便工程调试和问题定位。但是在产品发布的时候,为了节省系统资源,那些调试信息或是一些不总要的信息就不需要再记入到日志当中,所以我们需要设置相应的日志等级。

        Linux内核调试信息printk函数,它的输出等级在Linux内核中已经帮我们定义好。可以通过命令查看和设置系统日志等级:

    / # cat /proc/sys/kernel/printk
    4       4       1       7
    / # 
    / # 
    / # echo 7 4 1 7 > /proc/sys/kernel/printk
    / # 
    / # 
    / # cat /proc/sys/kernel/printk
    7       4       1       7  

        这四个值分别表示:控制台日志级别;默认的消息日志级别;最低的控制台日志级别,默认的控制台日志级别。这四个值是在kernel的printk.c文件中被定义,数值越小,优先级越高。如果要修改默然的开机启动日志级别,可以直接修改printk.c中的定义。

        对于应用层的日志输出控制,一般的应用会有自己的日志系统。如果没有日志系统,或是使用的日志系统比较混乱,也可以自己定义一套属于自己的日志系统。

    #ifdef __cplusplus
    extern "C" {
    #endif 
    /* __cplusplus */
    /*
    * Name: debug.h
    * Purpose: general debug system
    * Created By: licaibiao
    * Created Date: 2016.11.10
    * ChangeList: 
    */
    /*must use _B_  ,have a DEBUG_ in Jason*/
    #ifndef _DEBUG_B_H_
    #define _DEBUG_B_H_
    
    /*
    * debug control, you can switch on (delete 'x' suffix)
    * to enable log output and assert mechanism
    */
    #define CONFIG_ENABLE_DEBUG
    /*
    * debug level,
    * if is DEBUG_LEVEL_DISABLE, no log is allowed output,
    * if is DEBUG_LEVEL_ERR, only ERR is allowed output,
    * if is DEBUG_LEVEL_INFO, ERR and INFO are allowed output,
    * if is DEBUG_LEVEL_DEBUG, all log are allowed output,
    */
    enum debug_level {
    	DEBUG_LEVEL_DISABLE = 0,
    	DEBUG_LEVEL_ERR,
    	DEBUG_LEVEL_INFO,
    	DEBUG_LEVEL_DEBUG
    };
    #ifdef CONFIG_ENABLE_DEBUG
    /* it can be change to others, such as file operations */
    #include <stdio.h>
    #define PRINT printf
    
    #define  debug 	DEBUG_LEVEL_DISABLE
    
    #define ASSERT() 						\
    do { 									\
    	PRINT("ASSERT: %s %s %d", 			\
    	__FILE__, __FUNCTION__, __LINE__); 	\
    	while (1); 							\
    } while (0)
    
    #define ERR(...) 						\
    do { 									\
    	if (debug >= DEBUG_LEVEL_ERR) { 	\
    		PRINT(__VA_ARGS__); 			\
    	} 									\
    } while (0)
    
    #define INFO(...) 						\
    do { 									\
    	if (debug >= DEBUG_LEVEL_INFO) { 	\
    		PRINT(__VA_ARGS__); 			\
    	} 									\
    } while (0)
    
    #define DEBUG(...) 						\
    do { 									\
    	if (debug >= DEBUG_LEVEL_DEBUG) { 	\
    		PRINT(__VA_ARGS__); \
    	} 									\
    } while (0)
    
    #else /* CONFIG_ENABLE_DEBUG */
    
    #define ASSERT()
    #define ERR(...)
    #define INFO(...)
    #define DEBUG(...)
    #endif /* CONFIG_ENABLE_DEBUG */
    
    
    #endif /* _DEBUG_H_ */
    
    #ifdef __cplusplus
    }
    #endif /* __cplusplus */
    

        在应用程序中可以直接包含头文件调用接口:

    ERR("This is a test interface \n");

        对于linux应用层的日志信息,如果要将日志写入到文件中,且能够打印时间戳等信息,可以使用下面的接口:

    #ifndef __GPS_DEBUG_H__
    #define __GPS_DEBUG_H__
    
    #include <stdio.h>
    #include <time.h>
    #include <stdarg.h>
    #include <sys/statfs.h> 
    #define MAX_LOGFILE_SIZE 50000
    #define LOGFLAG 1
    enum UserDefineLogNum
    {
        GENERAL_LOG_NUM=1,
        DAEMON_LOG_NUM,
        ROUTER_LOG_NUM,
        MODEM_LOG_NUM,
        PERIPHER_LOG_NUM,
        GPSSERVICE_LOG_NUM,
        CAPTURE_LOG_NUM,
        OTHER_LOG_NUM,
    };
    
    #if LOGFLAG > 0
    #define TRACE_TRACE_GENERAL     Trace(GENERAL_LOG_NUM, __LINE__) 
    #define TRACE_DAEMON            Trace(DAEMON_LOG_NUM,  __LINE__)  
    #define TRACE_ROUTER            Trace(ROUTER_LOG_NUM, __LINE__)           
    #define TRACE_MODEM             Trace(MODEM_LOG_NUM, __LINE__)           
    #define TRACE_PERIPHER          Trace(PERIPHER_LOG_NUM, __LINE__)         
    #define TRACE_GPSSERVICE        Trace(GPSSERVICE_LOG_NUM, __LINE__)            
    #define TRACE_CAPTURE           Trace(CAPTURE_LOG_NUM, __LINE__)     
    #define TRACE_OTHER             Trace(OTHER_LOG_NUM, __LINE__)      
    #else
    #define TRACE printf
    #define TRACE_GENERAL printf
    #define TRACE_DAEMON printf
    #define TRACE_GPS printf
    #define TRACE_CAPTURE printf
    #define TRACE_PPP printf
    #define TRACE_COMM printf
    #define TRACE_UPDATE printf
    #endif
    #define SYSLOGDIR "/mnt/log/"
    #define SYSLOGDISK "/mnt/"
    #define MIX_AVAILABLE_DISK  (1024+512)
    #define TRACE_HST (printf("%s(%d)-<%s>: ",__FILE__, __LINE__, __FUNCTION__), printf)
    class Trace
    {
    public:
    	Trace(UserDefineLogNum LogNum, int nLineNo ):defineLogNum(LogNum),m_nLineNo(nLineNo)
    	{
        }
    	inline void operator()(const char *pszFmt, ...) const
    	{
    		va_list ptr;
    		va_start(ptr, pszFmt);
    		TraceV(m_nLineNo,pszFmt,ptr);
    		va_end(ptr);
    	}
    
    private:
        unsigned int availableDisk(const char * pcDir) const
        {
        	if(NULL == pcDir)
        		return -1;
        	struct statfs diskInfo;
        	unsigned int blocksize = 0;       //每个block里包含的字节数  
        	unsigned int availableDisk  = 0;  //可用空间大小
        	int iRet = -1;
        	iRet = statfs(pcDir, &diskInfo);
        	if(0 == iRet)
        	{
        		blocksize = diskInfo.f_bsize; 
        		availableDisk = diskInfo.f_bavail * blocksize/1024;//(K)
        	}
        	return availableDisk;
        }
        void TraceV(int nLine,const char *pszFmt, va_list args) const
        {
            time_t tNow;
            time(&tNow);
            struct tm *time;
            time=localtime(&tNow);
            char log_path[64] ={0};
            char log_dir[64] ={0};
            if(time->tm_year-100 < 16 && time->tm_year-100 > 30)
            {
                time->tm_year =116;
                time->tm_mon =0;
            }
            if(MIX_AVAILABLE_DISK>=availableDisk(SYSLOGDISK))
            {
                system("rm -rf /mnt/log/*"); //统一删除不做覆盖
                return;
            }
            sprintf(log_dir,"%sl-%02d%02d%02d",SYSLOGDIR,(time->tm_year-100),(1+time->tm_mon),(time->tm_mday));
            if ( 0 != access(log_dir, F_OK) )
            {
                if( mkdir(log_dir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)==0 )
                {
                    printf("[%s:%d] create dir %s ok!\n", __func__, __LINE__,log_dir);
                }
                else
                {
                    printf("[%s:%d] create dir %s error!\n", __func__, __LINE__,log_dir);
                    perror("mkdir");
            		return;
                }
            }
            sprintf(log_path,"%s/1000000%d.log",log_dir,defineLogNum);
            FILE* pFile=fopen(log_path,"a+");
            if (pFile==NULL)
            {
                vprintf(pszFmt,args);
                return;
            }
            fprintf(pFile,"%02d-%02d %02d:%02d:%02d :  ",time->tm_mon+1,time->tm_mday,time->tm_hour,time->tm_min,time->tm_sec);
            vfprintf(pFile,pszFmt,args);
            fclose(pFile);
            return;
        }
    private:
        UserDefineLogNum defineLogNum;
        const int m_nLineNo;
    };
    
    #endif
    
    
    

            上面代码可以实现不同进程调用同一套接口,根据时间和预定义的名字将日志文件打印到相应的文件中去。

     

     

    展开全文
  • linux日志文件系统总结

    千次阅读 2013-09-19 16:13:31
    系统日志(本文参考了ibm网站的linux安全第二卷)  在 Linux 下使用各种日志文件,有些用于某些特殊用途,例如:/var/log/xferlog 用于记录文件传输协议 FTP 的信息。其他日志文件,例如 /var/... 我们主要讲解两个日志

    系统日志(本文参考了ibm网站的linux安全第二卷)
             在 Linux 下使用各种日志文件,有些用于某些特殊用途,例如:/var/log/xferlog 用于记录文件传输协议 FTP 的信息。其他日志文件,例如 /var/log/messages 文件通常包含许多系统和内核工具的输入项。这些日志文件为系统的安全状态提供了信息。


                我们主要讲解两个日志守护程序---syslog和klogd------并且简要叙述了由Linux操作系统生成的其他其他日志文件。目的是提供基本的配置情况。


    syslog系统日志工具
               大部分的 Linux 系统中都要使用 syslog 工具,它是相当灵活的,能使系统根据不同的日志输入项采取不同的活动。下面将详细讨论syslog 的工作机制以及在配置文件/etc/syslog.conf 中的配置,还将论述利用 syslog 灵活性和功能性进行工作的各种方法 。以服务的形式运行,可以通过chkconfig --list | grep syslog来检查是否安装以及启动。
      1) 概述 
                 非常简单,syslog 工具由一个守护程序组成。它能接受访问系统的日志信息并且根据 /etc/syslog.conf 配置文件中的指令处理这些信息。程序,守护进程和内核提供了访问系统的日志信息。因此,任何希望生成日志信息的程序都可以向 syslog 接口呼叫生成该信息。
    通常,syslog 接受来自系统的各种功能的信息,每个信息都包括重要级。/etc/syslog.conf 文件通知 syslogd 如何根据设备和信息重要级别来报告信息。
    2) etc/syslog.conf

    # Log all kernel messages to the console.
    # Logging much else clutters up the screen.
    #kern.*                                                 /dev/console
    
    # Log anything (except mail) of level info or higher.
    # Don't log private authentication messages!
    *.info;mail.none;authpriv.none;cron.none                /var/log/messages
    
    # The authpriv file has restricted access.
    authpriv.*                                              /var/log/secure
    
    # Log all the mail messages in one place.
    mail.*                                                  -/var/log/maillog
    
    
    # Log cron stuff
    cron.*                                                  /var/log/cron
    
    # Everybody gets emergency messages
    *.emerg                                                 *
    
    # Save news errors of level crit and higher in a special file.
    uucp,news.crit                                          /var/log/spooler
    
    # Save boot messages also to boot.log
    local7.*                                                /var/log/boot.log
    


             /etc/syslog.conf 文件使用下面的形式
            facility.level    action
           空白行和以#开头的行可以忽略。Facility.level 字段也被称做 seletor。应该使用一次或多次 tab 键分隔 facility 和 action。大部分 Linux 使用这些空格为分隔符。现在分析一下 /etc/syslog.conf 中的三个要素。
           facility 指定 syslog 功能,主要包括以下这些:


    auth  由 pam_pwdb 报告的认证活动。
    authpriv 包括特权信息如用户名在内的认证活动
    cron  与 cron 和 at 有关的信息。
    daemon 与 inetd 守护进程有关的信息。
    kern  内核信息,首先通过 klogd 传递。
    lpr   与打印服务有关的信息。
    mail  与电子邮件有关的信息
    mark  syslog 内部功能用于生成时间戳
    news  来自新闻服务器的信息
    syslog  由 syslog 生成的信息
    user   由用户程序生成的信息
    uucp   由 uucp 生成的信息
    local0----local7   与自定义程序使用,例如使用 local5 做为 ssh 功能
    *   通配符代表除了 mark 以外的所有功能


                与每个功能对应的优先级是按一定顺序排列的,emerg 是最高级,其次是 alert,依次类推。缺省时,在 /etc/syslog.conf 记录中指定的级别为该级别和更高级别。如果希望使用确定的级别可以使用两个运算符号!(不等)和=。
    user.=info
    表示告知 syslog 接受所有在 info 级别上的 user 功能信息。
    syslog 级别如下:


    emerg 或 panic   该系统不可用
    alert            需要立即被修改的条件
    crit             阻止某些工具或子系统功能实现的错误条件
    err             阻止工具或某些子系统部分功能实现的错误条件
    warning         预警信息
    notice           具有重要性的普通条件
    info             提供信息的消息
    debug           不包含函数条件或问题的其他信息
    none            没有重要级,通常用于排错
    *               所有级别,除了none


                action字段所表示的活动具有许多灵活性,特别是,可以使用名称管道的作用是可以使 syslogd 生成后处理信息。
                syslog 主要支持以下活动
    file     指定文件的绝对路径
    terminal 或 print    完全的串行或并行设备标志符
    @host   远程的日志服务器
    username  发送信息到使用 write 的指定用户中
    named pipe  指定使用 mkfifo 命令来创建的 FIFO 文件的绝对路径。

           3) 调用 syslogd 守护程序
              syslog 守护程序是由 /etc/rc.d/init.d/syslog 脚本在运行级2下被调用的,缺省不使用选项。但有两个选项 -r 和 -       h 很有用。
             如果将要使用一个日志服务器,必须调用 syslogd -r。缺省情况下 syslog 不接受来自远程系统的信息。当指定 -r 选项,syslogd 将会监听从 514 端口上进来的 UDP 包。
    如果还希望日志服务器能传送日志信息,可以使用 -h 标志。缺省时,syslogd 将忽略使其从一个远程系统传送日志信息到另一个系统的/etc/syslog.conf 输入项。
          上面所述即将/etc/sysconfig/syslog中将Syslogd_Options中加入-r –h参数。

    4) klogd 守护进程
           klogd 守护进程获得并记录 Linux 内核信息。通常,syslogd 会记录 klogd 传来的所有信息,然而,如果调用带有 -f filename 变量的 klogd 时,klogd 就在 filename 中记录所有信息,而不是传给 syslogd。当指定另外一个文件进行日志记录时,klogd 就向该文件中写入所有级别或优先权。Klogd 中没有和 /etc/syslog.conf 类似的配置文件。使用 klogd 而避免使用 syslogd 的好处在于可以查找大量错误。如果有人入侵了内核,使用 klogd 可以修改错误。


    5) 其他日志
    /var/log 和不同版本的系统中以及自己配置的应用程序中都可以找到其他日志文件。当然,/etc/syslog.conf 列出了由 syslogd 管理的所有日志文件名和位置。其他日志由其他应用程序管理。apache server 生成 /var/log/htmlaccess.log 文件记录客户访问,生成 /var/log/httpd/error.log 文件在 syslog 以外查找错误。
    cron 工具维护的信息日志文件 /var/log/cron。当 Linuxconf 工具记录系统重新配置信息时,将生成日志文件如 /var/log/nerconf.log。samba 在 /var/log/samba 中维护其日志信息。
    /var/run/utmp记录所有当前登录到系统的用户,使用w或who命令来查看。
    /var/log/wtmp记录所有用户的登陆和注销,使用last命令来查看。
    /var/log/lastlog中记录所有用户最后一次的登陆时间,使用lastlog命令来查看。

     

         dmesg

          使用dmesg命令可以快速查看最后一次系统引导的引导日志

         dmesg | more

       

                                                                                          图1、dmesg

        /var/log/secure  登录日志(是否被攻击)

      插曲:

    限制所有用户包含root 登录3次失败后 锁定300秒
    /etc/pam.d/vsftpd   vsftpd配置
    /etc/pam.d/sshd     sshd配置
    /etc/pam.d/login    终端登陆配置
    在#%PAM-1.0下面添加
    auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=300

     

     

    /var/log/secure:记录登入系统存取数据的文件,例如 pop3, ssh, telnet, ftp 等都会被记录;

    /var/log/wtmp:记录登入者的讯息数据,由于本文件已经被编码过,所以必须使用 last指令来取出文件的内容;

    /var/log/messages:尤为重要,几乎发生的错误讯息(或是重要信息)都会被记录在此;

    /var/log/boot.log:记录开机或者是一些服务启动的时候,所显示的启动或关闭讯息;

    /var/log/maillog 或 /var/log/mail/*:纪录邮件存取或往来( sendmail 与 pop3 )的使用者记录;

    /var/log/cron:记录 crontab 这个例行性服务的内容

     

     


    6)       手工操作日志
    可以使用logger命令来手工操作记录,
    logger xxx >> /var/log/messages


    7)       使用logrotate对日志文件转储(本文转载)

               logrotate 没有以服务的形式进行运行,而是通过规定的时间到了之后才来进行日志文件的轮替,所以这个logrotate程序是挂在cron下面进行的(/etc/cron.daily/logrotate)。

          

                                                          图1 logrotate 配置文件

              对于Linux 的系统安全来说,日志文件是极其重要的工具。系统管理员可以使用logrotate 程序用来管理系统中的最新的事件。
              对于Linux 的系统安全来说,日志文件是极其重要的工具。
              系统管理员可以使用logrotate 程序用来管理系统中的最新的事件。logrotate 还可以用来备份日志文件,本篇将通过以下几部分来介绍
             日志文件的管理:


    1、logrotate 配置
    2、缺省配置 logrotate
    3、使用include 选项读取其他配置文件
    4、使用include 选项覆盖缺省配置
    5、为指定的文件配置转储参数

    一、logrotate 配置
                logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
              logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。
              logrotate 的配置文件是 /etc/logrotate.conf。主要参数如下表:
             参数 功能


    compress 通过gzip 压缩转储以后的日志
    nocompress 不需要压缩时,用这个参数
    copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
    nocopytruncate 备份日志文件但是不截断
    create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
    nocreate 不建立新的日志文件
    delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
    nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
    errors address 专储时的错误信息发送到指定的Email 地址
    ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
    notifempty 如果是空文件的话,不转储
    mail address 把转储的日志文件发送到指定的E-mail 地址
    nomail 转储时不发送日志文件
    olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
    noolddir 转储后的日志文件和当前日志文件放在同一个目录下
    prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
    postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
    daily 指定转储周期为每天
    weekly 指定转储周期为每周
    monthly 指定转储周期为每月
    rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
    tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
    size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).


    二、缺省配置 logrotate
            logrotate 缺省的配置/etc/logrotate.conf。
             Red Hat Linux 缺省安装的文件内容是:


    # see "man logrotate" for details
    # rotate log files weekly
    weekly
    # keep 4 weeks worth of backlogs
    rotate 4
    # send errors to root
    errors root
    # create new (empty) log files after rotating old ones
    create
    # uncomment this if you want your log files compressed
    #compress 1
    # RPM packages drop log rotation information into this directory
    include /etc/logrotate.d
    # no packages own lastlog or wtmp --we'll rotate them here
    /var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
    }
    /var/log/lastlog {
    monthly
    rotate 1
    }
    # system-specific logs may be configured here


    缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。
    第三行weekly 指定所有的日志文件每周转储一次。
    第五行 rotate 4 指定转储文件的保留 4份。
    第七行 errors root 指定错误信息发送给root。
    第九行create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和
    原来的文件一样的权限。
    第11行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。


    三、使用include 选项读取其他配置文件
             include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个
    主要的配置文件。当 logrotate 从logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。
              第13行 include /etc/logrotate.d 告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM 软件包的日志转储参数一般存放在/etc/logrotate.d 目录。
    include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d 。
             典型的应用有:apache, linuxconf, samba, cron 以及syslog。
              这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。


    四、使用include 选项覆盖缺省配置
           当 /etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数,如下例:


    # linuxconf 的参数
    /var/log/htmlaccess.log
    { errors jim
    notifempty
    nocompress
    weekly
    prerotate
    /usr/bin/chattr -a /var/log/htmlaccess.log
    endscript
    postrotate
    /usr/bin/chattr +a /var/log/htmlaccess.log
    endscript
    }
    /var/log/netconf.log
    { nocompress
    monthly
    }


           在这个例子中,当 /etc/logrotate.d/linuxconf 文件被读入时,下面的参数将覆盖/etc/logrotate.conf中缺省的参数。
    Notifempty
    errors jim


    五、为指定的文件配置转储参数
            经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:
    # 注释
    /full/path/to/file
    {
    option(s)
    }
    下面的例子就是每月转储 /var/log/wtmp 一次:
    #Use logrotate to rotate wtmp
    /var/log/wtmp
    {
    monthly
    rotate 1
    }
    六、其他需要注意的问题
    1、尽管花括号的开头可以和其他文本放在同一行上,但是
    结尾的花括号必须单独成行。
    2、使用
    prerotate 和 postrotate 选项
    下面的例子是典型的脚本 /etc/logrotate.d/syslog,这个脚本只是对
    /var/log/messages 有效。
    /var/log/messages
    {
    prerotate
    /usr/bin/chattr -a /var/log/messages
    endscript
    postrotate
    /usr/bin/kill -HUP syslogd
    /usr/bin/chattr +a /var/log/messages
    endscript
    }


    第一行指定脚本对 /var/log messages 有效
    prerotate 命令指定转储以前的动作/usr/bin/chattr -a 去掉/var/log/messages文件的“只追加”属性 endscript 结束 prerotate 部分的脚本postrotate 指定转储后的动作
    /usr/bin/killall -HUP syslogd
    用来重新初始化系统日志守护程序 syslogd
    /usr/bin/chattr +a /var/log/messages
    重新为 /var/log/messages 文件指定“只追加”属性,这样防治程序员或用户覆盖此文件。
    最后的 endscript 用于结束 postrotate 部分的脚本


    3、logrotate 的运行分为三步:
    判断系统的日志文件,建立转储计划以及参数,通过cron daemon 运行下面的代码是 Red Hat Linux 缺省的crontab 来每天运行logrotate。
    #/etc/cron.daily/logrotate
    #! /bin/sh
    /usr/sbin/logrotate /etc/logrotate.conf


     

    展开全文
  • Linux同时运行多个Tomcat

    千次阅读 2017-05-22 17:00:53
    每个tomcat都有自己的端口和监听的端口,那么要多个运行,就...2)首先下载对应的linux下的tomcat版本,存放于2个目录,这里以/usr/local/tomcat01和/usr/local/tomcat02为例,多个以此类推。这里tomcat01为了统一,

    背景:起初是这样的:在一个tomact里放了好多个web项目,启动过,过一段时间,发现不能正常访问,现象就是感觉tomcat已经关闭了。查看日志发现:tomcat报错了<java.lang.OutOfMemoryError:PermGen space>,这才知道内存溢出了。FK!!!原来的放的项目太多了,这样就需要配置多个tomcat。

    每个tomcat都有自己的端口和监听的端口,那么要多个运行,就必须使用不同的端口,具体怎么操作呢,看下面:

    1)需要JDK作为支撑,这里就不做处理了,我这里的目录:/usr/local/jdk7

    2)首先下载对应的linux下的tomcat版本,存放于2个目录,这里以/usr/local/tomcat01和/usr/local/tomcat02为例,多个以此类推。这里tomcat01为了统一,就也把默认配置改掉了。

    3)首先,将tomcat02的根目录配置到/etc/profile中,如下:

    export JAVA_HOME=/usr/local/jdk7
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$JAVA_HOME/bin:$PATH
    
    CATALINA_BASE=/usr/local/tomcat01
    CATALINA_HOME=/usr/local/tomcat01
    export CATALINA_BASE CATALINA_HOME
    
    CATALINA_2_BASE=/usr/local/tomcat02
    CATALINA_2_HOME=/usr/local/tomcat02
    export CATALINA_2_BASE CATALINA_2_HOME
    
    TOMCAT_HOME=/usr/local/tomcat01
    export TOMCAT_HOME
    TOMCAT_2_HOME=/usr/local/tomcat02
    export TOMCAT_2_HOME

    配置完成后,执行source /etc/profile 使之生效。

    4)修改对应tomcat下conf目录下的server.xml文件,指定其对应端口号。

    tomcat01的,修改如下:第一个地方:修改关闭监听端口,默认8005,修改为8051,当然你可以改成其他任意没有用过的端口号。

    <Server port="8051" shutdown="SHUTDOWN">
      <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    第二个地方:修改http监听端口,默认8080,这里改成8081,我这里加了下其他配置。
    <Connector
             port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
             URIEncoding="UTF-8"
             minSpareThreads="1000"
             maxSpareThreads="4000"
             enableLookups="false"
             disableUploadTimeout="true"
             connectionTimeout="20000"
             acceptCount="4000"
             maxThreads="5000"
             maxProcessors="5000"
             minProcessors="100"
             useURIValidationHack="false"
             compression="on"
             compressionMinSize="2048"
            compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
             redirectPort="8443" />
    第三个地方:修改 AJP 的对应端口,默认8009,修改为9080:

    <Connector port="9080" protocol="AJP/1.3" redirectPort="8443" />
    好了,这样就把第一个的server.xml配置修改完成了。第二个tomca02的配置类似,3个端口我设置的是:8052,8083,9081

    5)修改tomcat/bin下的启动脚本,其实就是添加几行代码,如在tomcat01的startup.sh和shutdown.sh文件中添加如下代码:

    # -----------------------------------------------------------------------------
    # Start Script for the CATALINA Server
    # -----------------------------------------------------------------------------
    
    export JAVA_HOME=/usr/local/jdk7
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=$JAVA_HOME/lib
    export CATALINA_HOME=$CATALINA_HOME
    export CATALINA_BASE=$CATALINA_BASE
    
    # Better OS/400 detection: see Bugzilla 31132
    [注:]上下被#注释掉的地方,是为了方便大家找到添加的位置,是原来文件中的内容,我们这里添加的是export开头的代码。

    那么对应的tomcat02配置如下;

    export JAVA_HOME=/usr/local/jdk7
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=$JAVA_HOME/lib
    export CATALINA_HOME=$CATALINA_2_HOME
    export CATALINA_BASE=$CATALINA_2_BASE
    哦了,这样就完成了linux中多个tomcat的配置。下面就可以在每个tomcat/bin目录下分别执行./startup.sh了。最后在浏览器中分别输入http://localhost:8081和http://localhost:8083就可以看到,已经配置成功了。

    ###如果您觉得帮到您,请顶一下。谢谢呢!###





    展开全文
  • Linux 日志文件搜索

    千次阅读 2018-01-31 14:10:08
    1. 通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们还有需求就是输出当前这个日志的前后几行: cat error.log | grep -C 5 'nick' 显示file文件里匹配foo字串那行以及上下5行 cat error....

     1. 通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们还有个需求就是输出当前这个日志的前后几行:

    cat error.log | grep -C 5 'nick' 显示file文件里匹配foo字串那行以及上下5行
    cat error.log | grep -B 5 'nick' 显示foo及前5行
    cat error.log | grep -A 5 'nick' 显示foo及后5             



    2、在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区别的。

      区别:(1)find命令是根据文件的属性进行查找文件,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。 

                   (2)grep是根据文件的内容进行查找内容,会对文件的每一行按照给定的模式(patter)进行匹配查找。

      一.find命令

        基本格式:find  path expression (exg: find ./ -name 'jsrm.log.*')

        1.按照文件名查找

        (1)find / -name httpd.conf  #在根目录下查找文件httpd.conf,表示在整个硬盘查找
        (2)find /etc -name httpd.conf  #在/etc目录下文件httpd.conf
        (3)find /etc -name '*srm*'  #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件
        (4)find ./ -name 'srm*'   #表示当前目录下查找文件名开头是字符串‘srm’的文件

        2.按照文件特征查找     

        (1)find / -amin -10   # 查找在系统中最后10分钟访问的文件(access time)
        (2)find / -atime -2   # 查找在系统中最后48小时访问的文件
        (3)find / -empty   # 查找在系统中为空的文件或者文件夹
        (4)find / -group cat   # 查找在系统中属于 group为cat的文件
        (5)find / -mmin -5   # 查找在系统中最后5分钟里修改过的文件(modify time)
        (6)find / -mtime -1   #查找在系统中最后24小时里修改过的文件
        (7)find / -user fred   #查找在系统中属于fred这个用户的文件
        (8)find / -size +10000c  #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)
        (9)find / -size -1000k   #查找出小于1000KB的文件

        3.使用混合查找方式查找文件

        参数有: !,-and(-a),-or(-o)。

        (1)find /tmp -size +10000c -and -mtime +2   #在/tmp目录下查找大于10000字节并在最后2分钟内修改的文件
             (2)find / -user fred -or -user george   #在/目录下查找用户是fred或者george的文件文件
             (3)find /tmp ! -user panda  #在/tmp目录中查找所有不属于panda用户的文件
            

      二、grep命令

         基本格式:grep [options] expression(grep -n 'Exception ' jsrm.log)

         1.主要参数

        [options]主要参数:
        -c:只输出匹配行的计数。
        -i:不区分大小写
        -h:查询多文件时不显示文件名。
        -l:查询多文件时只输出包含匹配字符的文件名。
        -n:显示匹配行及行号。
        -s:不显示不存在或无匹配文本的错误信息。
        -v:显示不包含匹配文本的所有行。

        pattern正则表达式主要参数:
        \: 忽略正则表达式中特殊字符的原有含义。
        ^:匹配正则表达式的开始行。
        $: 匹配正则表达式的结束行。
        \<:从匹配正则表达 式的行开始。
        \>:到匹配正则表达式的行结束。
        [ ]:单个字符,如[A]即A符合要求 。
        [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
        .:所有的单个字符。
        * :有字符,长度可以为0。

        2.实例  

      (1)grep 'test' d*  #显示所有以d开头的文件中包含 test的行
      (2)grep ‘test’ aa bb cc    #显示在aa,bb,cc文件中包含test的行
      (3)grep ‘[a-z]\{5\}’ aa   #显示所有包含每行字符串至少有5个连续小写字符的字符串的行
      (4)grep magic /usr/src  #显示/usr/src目录下的文件(不含子目录)包含magic的行
      (5)grep -r magic /usr/src  #显示/usr/src目录下的文件(包含子目录)包含magic的行

      (6)grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),

    (转载:https://www.cnblogs.com/huninglei/p/5824205.html )


    展开全文
  • Linux 通过crontab 分割tomcat日志

    千次阅读 2017-06-30 15:20:04
    Linux 通过crontab 分割tomcat日志tomcat的catalina日志果断时间就会超大,无法进行查看,网上有很日志分割方法。本文主要研究通过linux的crontab定时任务分割tomcat日志的步骤: 首先准备sh执行脚本 以下脚本为...
  • Linux 日志管理 Logrotate

    千次阅读 2016-05-16 09:48:22
    我发现很多人的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过! ...
  • logrotate程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间。下面就对logrotate日志轮转操作做一梳理记录: 1)配置文件介绍 Linux...
  • 关于Linux中nohup.out日志过大问题   在此解决如下: 1,在nohup.out 所在目录创建一ClearNohup.sh 脚本,通过定时任务让其每周清理一次。防止nohup文件过大问题。 #!/bin/bash # Author: Ljohn # Last ...
  • Linux下nginx日志自动切割

    千次阅读 2016-01-07 17:52:27
    linux平台下nginx日志的自动切割
  • 普通的电脑主机都是一硬盘挂接到一总线上,这里是一对一的关系。而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者块网卡及IP来连接,这样的话,就构成了...
  • 集中化Linux日志管理系统

    千次阅读 2014-03-25 14:30:20
    笔者 工作中 负责 着 60  台Linux服务器的运维管理工作, 初期 每台机器日志的巡查,是一件相当耗时耗力的工作。后来经过 摸索 ,整理出一非常适合各种规模的服务器的日志集中化管理,巡查流程,为...
  • linux服务器的日志管理

    万次阅读 2017-06-26 22:28:48
    消息紧急程度排行 emerg:该系统不可用 alert:需要立即修改 ...none:没有重要级,通常用于排错有时候出错了,查看一下日志对排错是有很大帮助的,下面就来介绍一下各种日志文件#/var/log/message
  • Linux开发中,开发者为了能够了解Linux的进程启动过程或者启动顺序,往往需要借助一些工具或日志,今天这篇简短的文章就是介绍编译一个Linux开机启动脚本,记录各个进程模块的启动时间以及顺序。准备任务,在Linux...
  • 初级第一次在Linux下安装MySQL-5.7.19版本教程 请看上一篇,如果已经会安装了,那么请看这篇linux下安装多个mysql-5.7.19 如果有问题请加群扣扣群300458205 1-下载 2-跳过登陆 3-1安装多个数据库需要配置自己...
  • Linux面试题(2020最新版)

    万次阅读 多人点赞 2020-03-01 11:14:38
    文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和...Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什...
  • Linux设置'sudo'的10小技巧

    千次阅读 2017-01-12 19:23:22
    Linux和其他类Unix操作系统中,只有root用户可以运行所有命令并在系统上执行某些关键操作,如安装和更新,删除包,创建用户和组,修改重要的系统配置文件等。 然而,承担root用户角色的系统管理员可以允许其他...
  • Linux下服务器日志清理

    千次阅读 2018-01-03 14:22:39
    之前在做一项目,服务器部署在Linux系统下,后来发现服务器运行每天产生大量的日志文件,一个多月产生了60G的日志文件,消耗巨大的存储空间。后来就想办法让Linux系统自动每天清理7天以前的日志文件。  实现...
  • linux定时清理tomcat日志文件

    千次阅读 2019-03-20 19:06:18
    需求:最近公司服务器发现磁盘经常会被占满,查其原因是因为大量的日志文件。所有需要每天定时去清理过期的日志文件 一:编写脚本 [root@localhost home]# vim clean_catalina.sh 添加内容如下: # 删除 /...
  • linux安装多个mysql

    千次阅读 2019-09-21 08:06:46
    一、 Mysql多实例即一台服务器上运行多个Mysql服务进程 ,开启不同的服务端口,通过不同的socket 监听不同的服务端口来提供各自的服务。 二、 Mysql多例有以下几个特点:  1、有效利用服务器资源:通过多实例地...
  • Linux中audit日志的使用方法

    万次阅读 多人点赞 2017-02-27 21:48:52
    auditd服务的安装: 以CentOS6.5为例,使用下面的方法确认auditd服务的安装情况: yumlist audit audit-libs 确认以下两package是否安装: audit.x86_64
  • Linux下Tomcat日志定期清理

    千次阅读 2014-03-17 14:43:07
    服务器上的tomcat的catalina.out文件越来越大,查看起来很不方便,以前每次都是想起来的时候手工清理一下(cat /dev/null > catalina.out),后来发现了logratate这工具,Ubuntu下的mysql,nginx好像也是用的这工具...
  • Linux计划任务与日志管理

    万次阅读 2019-04-22 23:01:44
    日志的种类和记录方式-自定义ssh服务日志类型和存储位置 实战-日志切割-搭建远程日志收集服务器 实战-配置公司内网服务器每天定时自动开关机 1、计划任务-at-cron-计划任务使用方法 计划任务的安排方式分为两种: ...
  • linux的系统日志rsyslog

    千次阅读 2017-11-23 12:53:49
     Linux保存了系统中所发生事件的详细记录,这些记录称作日志文件或消息文件。可以查阅日志文件来确定系统当前状态,观察入侵者踪迹,寻找某特定程序(或事件)相关的数据。centos6使用rsyslog替代syslog来 二。...
  • 如何可以方便快捷的打印出自己想要的日志文件的格式,有没有一个统一的方法,不需要定义多个呢? 今天探索了一下这个问题的答案,还真有。 以前打印日志文件的时候,定义过的方法如下: void log4c_str(char *...
  • 移植linphone到arm-linux日志记录

    千次阅读 2013-05-31 17:46:58
    离上次写博客已经一年,参加工作已经一年了,做过很事情,再做一次的时候老是想不起...使用arm-linux-gcc4.5.1,这编译器是友善之臂提供的,linux版本3.0.8 linphone移植需要依赖其他库: libogg-1.3.0.tar.gz
  • linux中一次启动多个jar的脚本

    千次阅读 2020-03-28 18:37:19
    我们在通过jar启动项目时,有时候会比较,启动会比较麻烦,需要编写shell脚本启动,vim start.sh #! /bin/sh # 端口号 PORTS=(9000 9205) # 模块 MODULES=(gateway customer-api) # 模块名称 MODULE_NAMES=(网关 ...
  • 文章目录一、查看日志1,查看实时日志2,查看实时日志指定关键字及高亮显示3,按照时间查询日志(sed )4,按照时间查询日志(sed )并过滤关键字并高亮显示并过滤行5,查看少量日志或文本6,查看比较日志或文本...
  • 最近在一hadoop测试集群运行一spark streaming程序,然后使用nohup ./execute.sh &amp; 执行让程序后台运行,才几天日志就上G了,如果有问题想要查看日志,显然打开文件是一件很麻烦的事,于是我想办法通过...
  • Nginx软件会把每用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由ngx_http_log_module模块负责。对应的官方地址为:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 122,845
精华内容 49,138
关键字:

linux日志path设置多个

linux 订阅