精华内容
下载资源
问答
  • 分布式日志系统

    千次阅读 2016-01-29 10:31:48
    为什么需要分布式日志系统 分布式日志系统架构 我们的分布式日志系统设计--埋点部分

    为什么需要分布式日志系统

    目前大部分互联网系统,都会涉及到分层,分离,分布式,以及集群。再加上负载均衡和反向代理,这样就会导致一个请求过来,我们根本不知道他走了那台应用服务器,路过了哪些服务,访问了哪些缓存服务和应用数据库;导致我们无法跟踪请求,分析系统,以及给解决问题带来了很大的难度。

    所以分布式日志,此时应运而生。分布式日志是基于每个请求,以该请求的线程为依据,跟踪请求经过的每个节点并留下足迹;并记录该请求访问的每一个服务及各个应用数据库。分布式日志洗头具有以下特点或功能:
    要能做到追踪每个请求的完整调用链路,
    收集调用链路上每个服务的性能数据,
    计算性能数据和比对性能指标(SLA),
    甚至在更远的未来能够再反馈到服务治理中,

    当然我们也可以根据自己的需求在此基础上附加以些功能。 下图是一个案例,先睹为快:


    分布式日志系统架构

    上图就是分布式日志系统的典型架构。
    1. 埋点:各应用系统和服务都需要进行日志的埋点,记录下每个线程执行留下的痕迹
    2. 日志收集处理系统
    3.  日志处理系统
    4. 日志分析系统
    5. 日志分析结果输出与展现

    埋点部分

    各个应用系统的埋点部分是关键,对日志分析结果有着至关重要的作用。当然这里也要结合具体的分析需求和具体的业务进行埋点。

    埋点原理如下图:


    简单说在系统的入口(http的api),生成一个 requestId,并初始化rpcNum为0 ;
    在整个请求执行过程中,入口应用A初始化为0 ,当A调用B 和C 以及消息服务时,分别分配 0.1,0.2,0.3;B调用FG时,分配0.1.1;0.1.2;C调用G时分配0.2.1;以此类推。然后经过处理即可得到上图的树形日志结构。

    我们的日志系统:

    先整体看一下
    我们的分布式日志系统,分为4部分:
    数据采集--》数据分析--》数据存储--》平台接口
    数据采集:RPC, http,平台内部接口,Response接口

    数据分析:用spark/ELK(tail -f ...| scp ...)
    数据存储:Hbase/hive
    平台接口:Rest,分析结果的一个试图展现。

    本次分享重点是  : 数据采集 部分


    http 对应的是 API(Controller)拦截器               LogAspect的实现
    Rpc 对应的是remote(rpc接口)拦截器               LogAspect的实现

    原理是:
    1.拦截如上入口,在进入应用逻辑前,埋下埋点(在ThreadLocal中记录下RequestId和sequence),在处理应用逻辑处理完后,记录日志。
    2.在访问资源的地方,DB,Redis,MC拦截打印对应的日志。
    BaseResourceLog下
    memcache的 MemCacheDataSource
    redis的 ShardedJedisClient
    DB对应 mybatis的 插件MybatisLogPlugin

    本版本不足:
    还不能把日志穿起来,形成链路。无法很好的完成链路分析。

    下版的计划或者目的:(注:此处是军哥的剧透加上我的理解,以及网上相关文章的总结)
    1. 统一入口,入口进行埋点,API为唯一入口
    2. 后续调用均使用埋点中requestId 和正确的维护 sequence。
    3. RPC调用时携带RequestId和sequence
    4. 如果需要分析 Service相关信息,可再定义一个Service拦截器。

    sequence的维护如下:




























    展开全文
  • Linux 日志系统

    千次阅读 2018-09-06 22:08:50
    可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。收集你想要的数据,分析出有价值的信息,可以提高系统、产品的安全性,还可以帮助开发完善代码,优化产品。日志会...

    日志数据可以是有价值的信息宝库,也可以是毫无价值的数据泥潭。它可以记录下系统产生的所有行为,并按照某种规范表达出来。可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。收集你想要的数据,分析出有价值的信息,可以提高系统、产品的安全性,还可以帮助开发完善代码,优化产品。日志会成为在事故发生后查明“发生了什么”的一个很好的“取证”信息来源。日志可以为审计进行审计跟踪。

    一、常见的日志

    日志是一个系统管理员,一个运维人员,甚至开发人员不可或缺的东西,系统永久了偶尔会出现一些错误,需要日志来给系统排错,在一些网络应用服务不能正常工作的时候,需要日志来做问题定位,日志还是过往时间的记录表,可以通过它知道是否被不明用户登陆过等等。

    在linux中大部分的发行版都内置使用syslog系统日志,常见的日志一般存放在var/log中,来看看其他有哪些日志:

    ll /var/log
    

    根据图中所显示的日志,可以根据服务对象粗略的将日志分为两类:

    • 系统日志:主要存放系统内置程序或系统内核之类的日志信息如alternative.log,btmp等等;
    • 应用日志:主要是安装第三方应用所产生的日志,如:tomact7,apache3等等

    系统日志具有有哪些,都记录了怎样的信息:

    日志名称 记录信息
    alternatives.log 系统的一些更新替代信息记录
    apport.log 应用程序崩溃信息记录
    apt/history.log 使用 apt-get 安装卸载软件的信息记录
    apt/term.log 使用 apt-get 时的具体操作,如 package 的下载、打开等
    auth.log 登录认证的信息记录
    boot.log 系统启动时的程序服务的日志信息
    btmp 错误的信息记录
    Consolekit/history 控制台的信息记录
    dist-upgrade dist-upgrade 这种更新方式的信息记录
    dmesg 启动时,显示屏幕上内核缓冲信息,与硬件有关的信息
    dpkg.log dpkg 命令管理包的日志。
    faillog 用户登录失败详细信息记录
    fontconfig.log 与字体配置有关的信息记录
    kern.log 内核产生的信息记录,在自己修改内核时有很大帮助
    lastlog 用户的最近信息记录
    wtmp 登录信息的记录。wtmp可以找出谁正在进入系统,谁使用命令显示这个文件或信息等
    syslog 系统信息记录

    只闻其名,不见其人,并不能明白这些日志记录的内容。首先我们来看 alternatives.log 中的信息:

    从中得到的信息有程序作用,日期,命令,成功与否的返回码

    对于Debain系统,使用apt-get安装软件,因在 apt 文件夹中的日志信息,其中有两个日志文件 history.log 与 term.log,两个日志文件的区别在于 history.log 主要记录了进行了哪个操作,相关的依赖有哪些,而 term.log 则是较为具体的一些操作,主要就是下载包,打开包,安装包等等的细节操作。

    其他的日志格式也都类似于之前所查看的日志,主要便是时间,操作。而这其中有两个比较特殊的日志,其查看的方式比较与众不同,因为这两个日志并不是 ASCII 文件而是被编码成了二进制文件,所以我们并不能直接使用 less、cat、more 这样的工具来查看,这两个日志文件是 wtmp,lastlog。

    查看的方法是使用 last 与 lastlog 工具来提取其中的信息

    二、配置的日志

    这些日志是如何产生的?通过上面的例子我们可以看出大部分的日志信息似乎格式都很类似,并且都出现在这个文件夹中。

    这样的实现可以通过两种方式:

    一种是由软件开发商自己来自定义日志格式然后指定输出日志位置;
    一种方式就是 Linux 提供的日志服务程序,而我们这里系统日志是通过 syslog 来实现,提供日志管理服务。
    syslog 是一个系统日志记录程序,在早期的大部分 Linux 发行版都是内置 syslog,让其作为系统的默认日志收集工具,虽然时代的进步与发展,syslog 已经年老体衰跟不上时代的需求,所以他被 rsyslog 所代替了,较新的 Ubuntu、Fedora 等等都是默认使用 rsyslog 作为系统的日志收集工具

    rsyslog的全称是 rocket-fast system for log,它提供了高性能,高安全功能和模块化设计。rsyslog 能够接受各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog 可以提供超过每秒一百万条消息给目标文件。

    这样能实时收集日志信息的程序是有其守护进程的,如 rsyslog 的守护进程便是 rsyslogd

    因为一些原因本实验环境中默认并没有打开这个服务,我们可以手动开启这项服务,然后来查看

    sudo apt-get update
    sudo apt-get install -y rsyslog
    sudo service rsyslog start
    ps aux | grep syslog
    

    既然它是一个服务,那么它便是可以配置,为我们提供一些我们自定义的服务

    首先我们来看 rsyslog 的配置文件是什么样子的,而 rsyslog 的配置文件有两个,

    • 一个是 /etc/rsyslog.conf:主要是配置的环境,即rsyslog加载什么模块
    • 一个是 /etc/rsyslog.d/50-default.conf:主要是配置的Filter Conditions。

    /etc/rsyslog.conf

    /etc/rsyslog.d/50-default.conf

    看看 rsyslog 的结构框架,数据流的走向,如下图:

    通过这个简单的流程图我们可以知道 rsyslog 主要是由 Input、Output、Parser 这样三个模块构成的,并且了解到数据的简单走向,首先通过 Input module 来收集消息,然后将得到的消息传给 Parser module,通过分析模块的层层处理,将真正需要的消息传给 Output module,然后便输出至日志文件中。

    Rsyslog 架构如图中所示,从图中我们可以很清楚的看见,rsyslog 还有一个核心的功能模块便是 Queue,也正是因为它才能做到如此高的并发。

    第一个模块便是 Input,该模块的主要功能就是从各种各样的来源收集 messages。而Output 中也有许多可用的接口,可以通过 man 或者官方的文档查看。

    配置中 rsyslog 支持三种配置语法格式:

    sysklogd
    legacy rsyslog
    RainerScript
    sysklogd 是老的简单格式,一些新的语法特性不支持。而 legacy rsyslog 是以 dollar 符()v6ModLoad 还有一些插件和特性只在此语法下支持。而以 $ 开头的指令是全局指令,全局指令是 rsyslogd 守护进程的配置指令,每行只能有一个指令。 RainnerScript 是最新的语法。在官网上 rsyslog 大多推荐这个语法格式来配置

    老的语法格式(sysklogd & legacy rsyslog)是以行为单位。新的语法格式(RainnerScript)可以分割多行。

    注释有两种语法:

    • 井号 #
    • C-style /* .. */

    执行顺序: 指令在 rsyslog.conf 文件中是从上到下的顺序执行的。

    模板是 rsyslog 一个重要的属性,它可以控制日志的格式,支持类似 template() 语句的基于 string 或 plugin 的模板,通过它我们可以自定义日志格式。

    legacy 格式使用 $template 的语法,不过这个在以后要移除,所以最好使用新格式 template():,以免未来突然不工作了也不知道为什么

    模板定义的形式有四种,适用于不同的输出模块,一般简单的格式,可以使用 string 的形式,复杂的格式,建议使用 list 的形式,使用 list 的形式,可以使用一些额外的属性字段(property statement)

    如果不指定输出模板,rsyslog 会默认使用 RSYSLOG_DEFAULT。

    了解了 rsyslog 环境的配置文件之后,再看向 /etc/rsyslog.d/50-default.conf 这个配置文件,这个文件中主要是配置的 Filter Conditions,也就是我们在流程图中所看见的 Parser & Filter Engine,它的名字叫 Selectors 是过滤 syslog 的传统方法,他主要由两部分组成,facility 与 priority,其配置格式如下:

    facility.priority     log_location
    

    其中一个 priority 可以指定多个 facility,多个 facility 之间使用逗号 , 分割开,具体可见上图

    rsyslog 通过 Facility 的概念来定义日志消息的来源,以便对日志进行分类,Facility 的种类有:

    | kern | 内核消息 |
    | user | 用户信息 |
    | mail | 邮件系统消息 |
    | daemon | 系统服务消息 |
    | auth | 认证系统 |
    | authpriv | 权限系统 |
    | syslog | 日志系统自身消息 |
    | cron | 计划安排 |
    | news | 新闻信息 |
    | local0~7 | 由自定义程序使用 |

    而另外一部分 priority 也称之为 serverity level,除了日志的来源以外,对统一源产生日志消息还需要进行优先级的划分,而优先级的类别有一下几种:

    类别 解释
    emergency 系统已经无法使用了
    alert 必须立即处理的问题
    critical 很严重了
    error 错误
    warning 警告信息
    notice 系统正常,但是比较重要
    informational 正常
    debug debug的调试信息
    panic 很严重但是已淘汰不常用
    none 没有优先级,不记录任何日志消息

    auth,authpriv.*       /var/log/auth.log
    

    这里的意思是 auth 与 authpriv 的所有优先级的信息全都输出于 /var/log/auth.log 日志中

    而其中有类似于这样的配置信息意思有细微的差别

    kern.*      -/var/log/kern.log
    

    -代表异步写入,也就是日志写入时不需要等待系统缓存的同步,也就是日志还在内存中缓存也可以继续写入无需等待完全写入硬盘后再写入。通常用于写入数据比较大时使用。

    与日志相关的还有一个还有常用的命令 logger,logger 是一个 shell 命令接口,可以通过该接口使用 Syslog 的系统日志模块,还可以从命令行直接向系统日志文件写入信息。

    #首先将syslog启动起来
    sudo service rsyslog start
    
    #向 syslog 写入数据
    ping 127.0.0.1 | logger -it logger_test -p local3.notice &
    
    #查看是否有数据写入
    sudo tail -f /var/log/syslog
    

    从图中我们可以看到我们成功的将 ping 的信息写入了 syslog 中,格式也就是使用的 rsyslog 的默认模板

    我们可以通过 man 来查看 logger 的其他用法,

    参数 内容
    -i 在每行都记录进程 ID
    -t 添加 tag 标签
    -p 设置日志的 facility 与 priority

    三、转储的日志

    在本地的机器中每天都有成百上千条日志被写入文件中,更别说是我们的服务器,每天都会有数十兆甚至更多的日志信息被写入文件中,如果是这样的话,每天看着我们的日志文件不断的膨胀,那岂不是要占用许多的空间,所以有个叫 logrotate 的东西诞生了。

    logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件。我们可以根据日志文件的大小,也可以根据其天数来切割日志、管理日志,这个过程又叫做“转储”。

    大多数 Linux 发行版使用 logrotate 或 newsyslog 对日志进行管理。logrotate 程序不但可以压缩日志文件,减少存储空间,还可以将日志发送到指定 E-mail,方便管理员及时查看日志。

    显而易见,logrotate 是基于 CRON 来运行的,其脚本是 /etc/cron.daily/logrotate;同时我们可以在 /etc/logrotate 中找到其配置文件

    cat /etc/logrotate.conf
    

    # see "man logrotate" for details  //可以查看帮助文档
    # rotate log files weekly
    weekly                             //设置每周转储一次(daily、weekly、monthly当然可以使用这些参数每天、星期,月 )
    # keep 4 weeks worth of backlogs
    rotate 4                           //最多转储4次
    # create new (empty) log files after rotating old ones
    create                             //当转储后文件不存在时创建它
    # uncomment this if you want your log files compressed
    compress                          //通过gzip压缩方式转储(nocompress可以不压缩)
    # RPM packages drop log rotation information into this directory
    include /etc/logrotate.d           //其他日志文件的转储方式配置文件,包含在该目录下
    # no packages own wtmp -- we'll rotate them here
    /var/log/wtmp {                    //设置/var/log/wtmp日志文件的转储参数
        monthly                        //每月转储
        create 0664 root utmp          //转储后文件不存在时创建它,文件所有者为root,所属组为utmp,对应的权限为0664
        rotate 1                       //最多转储一次
    }
    

    当然在 /etc/logrotate.d/ 中有各项应用的 logrotate 配置,还有更多的配置参数,大家可以使用 man 查看,如按文件大小转储,按当前时间格式命名等等参数配置。

    展开全文
  • django 日志系统

    千次阅读 2017-12-20 16:21:00
    django使用python内建的logging模块去建造自己的系统日志的,如果你想详细了解这个模块的话,请自己去看python的说明文档,这里仅仅介绍django中的日志系统 日志配置包括四个部分:记录器,处理器,过滤器和格式器...

    我的代码:

    1.settings.py文件中

    #django日志系统
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'filters': {
            'require_debug_true': {
                '()': 'django.utils.log.RequireDebugTrue',
            }, # 针对 DEBUG = True 的情况
        },
        'formatters': {
            'standard': {
                'format': '%(levelname)s %(asctime)s %(pathname)s %(filename)s %(module)s %(funcName)s %(lineno)d: %(message)s'
            }, # 对日志信息进行格式化,每个字段对应了日志格式中的一个字段,更多字段参考官网文档,我认为这些字段比较合适,输出类似于下面的内容
            # INFO 2016-09-03 16:25:20,067 /home/ubuntu/mysite/views.py views.py views get 29: some info...
        },
        'handlers': {
            'mail_admins': {
                'level': 'ERROR',
                'class': 'django.utils.log.AdminEmailHandler',
                 'formatter':'standard'
            },
            'file_handler': {
                 'level': 'DEBUG',
                 'class': 'logging.handlers.TimedRotatingFileHandler',
                 'filename': os.path.join(BASE_DIR, "logging\\test.log"),   #网上的报错,改成相对路径
                 'formatter':'standard'
            }, # 用于文件输出
            'console':{
                'level': 'INFO',
                'filters': ['require_debug_true'],
                'class': 'logging.StreamHandler',
                'formatter': 'standard'
            },
        },
        'loggers': {
            'django': {
                'handlers' :['file_handler', 'console'],
                'level':'DEBUG',
                'propagate': True # 是否继承父类的log信息
            }, # handlers 来自于上面的 handlers 定义的内容
            'django.request': {
                'handlers': ['mail_admins'],
                'level': 'ERROR',
                'propagate': False,
            },
        }
    }
    

    2.在views.py中调用,不知道是不是每个都需要调用,暂时都调用了

    #记录日志
    import logging
    logger = logging.getLogger("django") # loggers中定义的名称
    logger.info("some info...")
    


    3.得到了报错日志,该文件下有所有的信息。



    4.若想单独打印bug信息,则需要根据对应的函数自己写try except然后打日志。这步还没做。




    另外一篇简单的配置博文:

    http://blog.csdn.net/novostary/article/details/52424116

    django使用python内建的logging模块去建造自己的系统日志的,如果你想详细了解这个模块的话,请自己去看python的说明文档,这里仅仅介绍django中的日志系统

    日志配置包括四个部分:记录器,处理器,过滤器和格式器,下面我们来一一讲解

    记录器

    一个记录器是日志系统的一个实体,每一个记录器是一个已经命名好的可以将消息为进程写入的“桶”。

    每一个记录器都会有一个日志等级,每个等级描述了记录器即将处理的信息的严重性,python定义了以下五个等级:

    debug:出于调试目的的低层次系统信息

    • info:普通的系统信息
    • warning:描述已经发生的小问题
    • error:描述已经发生的主要问题
    • critical:描述已经发生的严重问题

    每一条被写入记录器的信息成为一条日志记录,每条日志记录都有一个表明该记录严重性的日志等级,每条日志信息也会包含一些有用的元信息表明已经被记录的事件,比如栈追溯和错误代码。

    当一条信息被发往记录器的时候,消息的记录等级会和记录器的等级相比较,如果符合甚至超越当前等级,则被发往处理器处理,否则会被忽略掉。

    处理器

    处理器是决定日志记录器中对应的实体消息发生了什么的引擎,描述了一个具体的日志行为,比如输出到屏幕,或者一个文件,抑或一个网络socket。

    和记录器一样,没有到达相应等级的消息会被忽略。

    一个记录器可以有多个处理器,一个处理器可以有不同的日志等级,因此你可以根据消息的重要性而提供不同的提示。

    过滤器

    过滤器是用来提供额外的控制,控制哪些日志记录可以被传给处理器处理。

    默认情况下,只要日志消息符合相应的等级要求就会传给对应的处理器处理,然而,通过安装过滤器,你可以在日志记录过程中设置额外的内容,例如,你可以安装一个过滤器使得某个源只有error级别的消息才会被发送。你也可以使用过滤器修改之前会被发送的消息,例如,你可以写一个过滤器使得符合某些条件的error等级的消息降级为warning等级。

    过滤器可以给处理器和记录器使用,多个过滤器可以级联使用。

    格式器

    控制日志输出的格式,格式使用python的字符串控制格式

    使用日志

    一旦配置好你的记录器,处理器,过滤器和格式器,你需要在你的代码中调用日志功能,下面是一个简单的例子:

    复制代码
    复制代码
    # import the logging library
    import logging
    
    # Get an instance of a logger
    logger = logging.getLogger(__name__)
    
    def my_view(request, arg1, arg):
        ...
        if bad_mojo:
            # Log an error message
            logger.error('Something went wrong!')
    复制代码
    复制代码

     

    命名你的记录器

    logging.getLogger()的调用获得一个记录器的实体,记录器实体通过名字来辨别。

    像上面的那个例子,一般是使用__name__,包含记录器的python模块的名字,这使得基于每个模块的记录成为可能

    或者你可以是用点号相连的名字,这意味着记录器的层次,点号之前的是点号之后的父模块,例如

    # Get an instance of a specific named logger
    logger = logging.getLogger('project.interesting.stuff')

     

    这种方式也很重要,因为通过层次,子层次的消息可以把消息发送给自己的父层次,如果你不想把消息发给你的父层次,记得把发送开关关闭掉。(下面会有介绍到)

    日志调用

    对应日志的五个等级,日志调用有五个对应的方法:

    • logger.critical()
    • logger.error()
    • logger.warning()
    • logger.info()
    • logger.debug()

    还有两个可用的日志方法可以调用:

    • logger.log():手工发送一个具体等级的日志消息
    • logger.exception():创建一个error等级的封装着异常堆栈帧内容的日志消息

    配置日志系统

    在代码中调用日志的前提是已经配置好了日志系统的记录器,处理器,过滤器和格式器,我们通过一个复杂的例子来详细讲解吧:

    复制代码
    复制代码
    LOGGING = {
        'version': 1,#指明dictConnfig的版本,目前就只有一个版本,哈哈
        'disable_existing_loggers': True,#禁用所有的已经存在的日志配置
        'formatters': {#格式器
            'verbose': {#详细
                'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
            },
            'simple': {#简单
                'format': '%(levelname)s %(message)s'
            },
        },
        'filters': {#过滤器
            'special': {#使用project.logging.SpecialFilter,别名special,可以接受其他的参数
                '()': 'project.logging.SpecialFilter',
                'foo': 'bar',#参数,名为foo,值为bar
            }
        },
        'handlers': {#处理器,在这里定义了三个处理器
            'null': {#Null处理器,所有高于(包括)debug的消息会被传到/dev/null
                'level':'DEBUG',
                'class':'django.utils.log.NullHandler',
            },
            'console':{#流处理器,所有的高于(包括)debug的消息会被传到stderr,使用的是simple格式器
                'level':'DEBUG',
                'class':'logging.StreamHandler',
                'formatter': 'simple'
            },
            'mail_admins': {#AdminEmail处理器,所有高于(包括)而error的消息会被发送给站点管理员,使用的是special格式器
                'level': 'ERROR',
                'class': 'django.utils.log.AdminEmailHandler',
                'filters': ['special']
            }
        },
        'loggers': {#定义了三个记录器
            'django': {#使用null处理器,所有高于(包括)info的消息会被发往null处理器,向父层次传递信息
                'handlers':['null'],
                'propagate': True,
                'level':'INFO',
            },
            'django.request': {#所有高于(包括)error的消息会被发往mail_admins处理器,消息不向父层次发送
                'handlers': ['mail_admins'],
                'level': 'ERROR',
                'propagate': False,
            },
            'myproject.custom': {#所有高于(包括)info的消息同时会被发往console和mail_admins处理器,使用special过滤器
                'handlers': ['console', 'mail_admins'],
                'level': 'INFO',
                'filters': ['special']
            }
        }
    }
    复制代码
    复制代码

     

    相信看完这个例子,对日志系统的配置大家基本了解了吧

    循环导入问题

    如果你自定义了一个处理器,然后再settings.py文件有配置,如果这是你在类实现文件里面导入settings模块的时候,就会出现循环导入的问题,建议只在settings.py配置文件里面配置

    自定义日志配置和禁用日志配置

    使用LOGGING_CONFIG属性自定义和禁用日志配置,LOGGING_CONFIG=None禁用

    django日志拓展

    django提供三个自带的记录器:

    django

    django记录器是捕捉所有消息的记录器,没有消息是直接发往django记录器的

    django.request

    5XX会引发一个error消息,4XX会引发一个warning消息,这个记录器还附带有额外的上下文:

    • status_code:HTTP响应吗
    • request:生成这个消息的request对象

    django.db.backens

    所有的由请求运行的sql语句都会记录一条debug的消息,每个记录器还附带有额外的上下文:

    • duration:sql语句运行的时间
    • sql:运行的sql语句
    • params:sql语句调用的参数

    处于网站运行的表现原因,仅当settings.DEBUG=True的时候,这个处理器才生效,否则即使配置了也无效

    除了python模块自带的,django自定义了一个处理器

    class AdminEmailHandler(include_html=False)

    这个处理器每收到一条消息就会发往站点管理员,如果日志信息包含request属性,那么整个request的详细信息也会被包包含在Email中发往站点管理员;如果日志信息包含堆栈跟踪信息,堆栈跟踪信息也会被发送。

    include_html属性控制当DEBUG为真的时候是否发送那些回溯信息,因为这些都是很敏感的系统系统,如果被人截获,可能会发生危险,所以要谨慎。配置这个属性示例如下:

    复制代码
    复制代码
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
        }
    },
    复制代码
    复制代码

     

    除了python自带的,django提供了两个自带的过滤器:

    class CallBackFilter(callback)

    这个过滤器接受一个回调函数(这个函数接受一个参数,被记录的信息),每个记录通过过滤器的时候都会调用这个回调函数,当回调函数返回False的时候,不处理这个记录。下面是一个示例:

    复制代码
    复制代码
    from django.http import UnreadablePostError
    
    def skip_unreadable_post(record):
        if record.exc_info:
            exc_type, exc_value = record.exc_info[:2]
            if isinstance(exc_value, UnreadablePostError):
                return False
        return True
    复制代码
    复制代码
    复制代码
    复制代码
    'filters': {
        'skip_unreadable_posts': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': skip_unreadable_post,
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['skip_unreadable_posts'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    复制代码
    复制代码

     

    class RequireDebugFalse

    这个过滤器仅当settings.DEBUG为False的时候会生效,默认是启用的,仅当settings.DEBUG=False的时候,AdminEmailHandler才生效

    复制代码
    复制代码
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse',
         }
     },
     'handlers': {
         'mail_admins': {
             'level': 'ERROR',
             'filters': ['require_debug_false'],
             'class': 'django.utils.log.AdminEmailHandler'
         }
     },
    复制代码
    复制代码
    展开全文
  • logbook日志系统

    千次阅读 2018-12-05 09:33:31
    python中替代logging的日志系统。 不过比之前的logging难理解。 先上打印到屏幕上的代码和存到日志文件中的代码: #!/usr/bin/env python3 # -*- coding: utf-8 -*- from logbook import Logger, StreamHandler, ...

    python中替代logging的日志系统。

    不过比之前的logging难理解。

    先上打印到屏幕上的代码和存到日志文件中的代码:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    from logbook import Logger, StreamHandler, TimedRotatingFileHandler
    import sys
    import os
    StreamHandler(sys.stdout).push_application()
    log = Logger('Logbook')
    log.info('Hello, World!')
    LOG_DIR = os.path.join('log')  
    if not os.path.exists(LOG_DIR):  
        os.makedirs(LOG_DIR)  
    TimedRotatingFileHandler(os.path.join(LOG_DIR, '%s.log' % 'user_log'), date_format='%Y%m%d', bubble=True).push_application() 
    user_log = Logger('user_log')
    user_log.info('user_log mytest....')
    

    然后看rqalpha代码,发现实际上写主要有两种类型,一种为打印到屏幕,一种为打印到文件。

    在初始化时,需要先利生成Logger实例:

    user_log = Logger(“user_log”)

    需要打印到屏幕,则生成打印到屏幕的句柄:

    user_std_handler = user_std_handler = ColorizedStderrHandler(bubble=True)

    然后对此句柄设置日志格式:

    user_std_handler.formatter = user_handler_log_formatter

    若想使此设置生效,

    只需申明user_log的句柄:

    user_log.handlers = []

    然后将之加入即可

    user_log.handlers.append(user_std_handler)

    同理,如果希望日志同时支持打印到文件,只需按照上述步骤再来一次即可。
    user_file_handler = TimedRotatingFileHandler(
    os.path.join(os.path.join(‘log’) , ‘%s.log’ % ‘test_log’), date_format=’%Y%m%d’, bubble=True)
    user_file_handler.formatter = user_handler_log_formatter

    user_log.handlers.append(user_file_handler)

    user_handler_log_formatter是一个日志格式函数,返回打印的日志以什么方式呈现。

    整体代码如下:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # filename:logger.py
    import os
    import logbook
    from logbook import Logger, TimedRotatingFileHandler
    from logbook.more import ColorizedStderrHandler
    DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S.00"
    def user_handler_log_formatter(record, handler):
        log = "[{dt}][{level}][{filename}][{func_name}][{lineno}] {msg}".format(
            dt=record.time,
            level=record.level_name,                       # 日志等级
            filename = os.path.split(record.filename)[-1], # 文件名
            func_name = record.func_name,                  # 函数名
            lineno = record.lineno,                        # 行号
            msg=record.message,                            # 日志内容
        )
        return log
    # 打印到屏幕句柄
    user_std_handler = ColorizedStderrHandler(bubble=True)
    user_std_handler.formatter = user_handler_log_formatter
    # 日志路径,在主工程下生成log目录
    LOG_DIR = os.path.join('log') 
    if not os.path.exists(LOG_DIR):  
        os.makedirs(LOG_DIR)
        
    # 打印到文件句柄
    user_file_handler = TimedRotatingFileHandler(
        os.path.join(LOG_DIR , '%s.log' % 'test_log'), date_format='%Y%m%d', bubble=True)
    user_file_handler.formatter = user_handler_log_formatter
    # 用户代码logger日志
    user_log = Logger("user_log")
    def init_logger():
        logbook.set_datetime_format("local")
        user_log.handlers = []
        user_log.handlers.append(user_std_handler)
        user_log.handlers.append(user_file_handler)    
        
    # 初始化日志系统(被默认调用)
    init_logger()
    测试代码如下:
    
    #!/usr/bin/evn python3
    # -*- coding: utf-8 -*-
    # filename: test_looger.py
    import os
    from logger import user_log as logger
    if __name__ == "__main__": 
        logger.info("my test.")
    打印日志如下:
    
    [2017-08-26 19:10:10.226902][INFO][test_logger.py][<module>][8] my test.
    
    展开全文
  • 日志系统之Flume日志收集

    千次阅读 2015-06-06 21:17:49
    本文介绍在日志系统中如何使用flume agent做日志收集以及为了满足我们的需求对flume agent进行了哪些扩展。
  • Unity自定义日志系统

    千次阅读 2019-05-28 18:14:26
    Unity的系统日志算是很好用,但当程序很大时,就会比较乱,所以在项目中我们往往要对日志系统进行重新封装使用。 一、日志系统封装 如下代码,我们可以通过m_Log来控制是否打印日志,或对输出的日志加入时间等修改...
  • syslog日志系统——框架选型

    千次阅读 2018-11-06 12:27:36
    title: syslog日志系统——框架选型 tags: syslog,layui,swagger,日志系统,echarts author: hunk.cai #syslog日志系统——框架选型 ##sysog概述 syslog日志系统主要作用是采集有价值的日志信息,然后进行日志的...
  • syslog日志系统——日志采集

    万次阅读 2018-11-08 14:00:17
    客户端埋点就是在客户系统植入日志发送的代码,可以是前端页面、app界面、后端服务等,把需要的日志信息发送到指定的日志采集接口。 日志的发送应该采用异步方式,这样不会对客户系统代码的执行造成影响。 日志采集 ...
  • C++实现log日志系统

    万次阅读 2018-04-19 14:33:10
    1.log日志的作用在软件开发周期中,不管是前台还是后台,系统一般会采用一个持久化的日志系统来记录运行情况。在代码中嵌入log代码信息,主要记录下列信息:(1)记录系统运行异常信息。(2)记录系统运行状态信息。...
  • C++ 实现简易 log 日志系统

    万次阅读 多人点赞 2015-07-16 10:46:11
    在软件开发周期中,不管是前台还是后台,系统一般会采用一个持久化的日志系统来记录运行情况。 在代码中嵌入log代码信息,主要记录下列信息: (1)记录系统运行异常信息。 (2)记录系统运行状态信息。 (3)记录...
  • MySQL日志系统:redo log、binlog、undo log 区别与作用

    万次阅读 多人点赞 2019-03-13 10:21:01
    日志系统主要有redo log(重做日志)和binlog(归档日志)。redo log是InnoDB存储引擎层的日志,binlog是MySQL Server层记录的日志, 两者都是记录了某些操作的日志(不是所有)自然有些重复(但两者记录的格式不同)。 ...
  • gitlab的日志系统

    万次阅读 2017-06-19 10:27:42
    gitlab会将所有的操作记录成日志,方便进行分析,gitlab的日志系统分为以下几类: 1、production.log:该日志位于/home/gitlab/logs/gitlab-rails中,其作用是记录gitlab的每次请求的具体信息,包括请求的URL、ip...
  • LINUX日志系统之WEB日志(一)

    千次阅读 2016-06-04 22:07:42
    linux日志系统的重要性想必大家都非常清楚了,我们平时的登录信息,各种操作信息,软件错误信息等等,想要系统一直健康稳定的运转,学会查看和管理日志系统是必不可少的技能。下面就来认识下web系统中的各种常用的...
  • Linux之日志系统

    千次阅读 2016-12-09 12:08:36
    我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。收集你想要的数据,分析出有价值的信息,可以提高系统、产品的安全性,可以帮助开发完善代码,优化产品。日志会...
  • 开源日志系统对比

    万次阅读 2014-12-29 17:53:51
    由于本人要开发 分布式日志系统,所以想整体下关于开源的日志系统 1. 背景介绍 许多公司的平台每天会产生大量的日志(一般为流式数据,如,搜索引擎的pv,查询等),处理这些日志需要特定的日志系统,一般而...
  • Spring 切换日志系统

    千次阅读 2017-01-14 08:25:45
    容器日志为何需要切换由于历史原因,Spring最开始在core包中引入的是commons-logging(JCL标准实现)的日志系统,官方考虑到兼容问题,在后续的Spring版本中并未予以替换,而是继续沿用。如果考虑到性能、效率,应该...
  • 网络游戏服务器之 日志系统

    千次阅读 2016-11-01 16:04:10
    几乎所有的游戏服务器框架都会有一组操作日志的接口,当然最简单的就是大家所熟悉的printf格式化到标准输出,日志系统的复杂度有高有低,具体目的主要是为调试及运营数据查询需要。可以说日志系统实现是否易用、简洁...
  • MongoDB 的日志系统

    千次阅读 2014-07-03 18:14:06
    MongoDB拥有几种日志,分别是系统日志、Journal日志、oplog主从日志、慢查询日志。这些日志记录着MongoDB数据库的不同的踪迹。 系统日志 系统日志记录着Mongodb启动和停止的操作,以及服务器在运行过程...
  • java日志系统详解

    万次阅读 2014-07-27 10:30:40
    Java日志系统确实比较丰富,常用的有log4j、JUL、logback等等,同时伴随着日志系统的发展,出现了日志框架commons-logging和slf4j。 简短地描述下日志发展,最先出现的是apache开源社区的log4j,这个日志确实是...
  • Loki日志系统详解1——背景

    千次阅读 2019-09-06 10:56:05
    Loki日志系统详解1——背景 Loki日志系统详解1——背景 最近,在对公司容器云的日志方案进行设计的时候,发现主流的ELK或者EFK比较重,再加上现阶段对于ES复杂的搜索功能很多都用不上最终选择了Grafana开源的Loki...
  • iOS搭建Log日志系统

    千次阅读 2018-09-26 15:44:47
    CocoaLumberjack ...本文主要介绍基于CocoaLumberjack搭建iOS项目Log日志系统。 CocoaLumberjack开源地址 一、CocoaLumberjack架构 CocoaLumberjack架构 二、简单使用 1、使用CocoaPods安装CocoaLumb...
  • 【Monogdb】MongoDB的日志系统

    千次阅读 2018-05-17 10:16:44
    记得前几天有个小伙伴要查看mongodb的日志,从而排查问题,可能总找不到日志放在何处,今天就系统说一下mongodb的日志系统。mongodb中主要有四种日志。分别是系统日志、Journal日志、oplog主从日志、慢查询日志等。...
  • 搭建 Elastic Stack 日志系统

    千次阅读 2017-11-07 18:37:46
    Elastic Stack 是原 ELK Stack 在 5.0 版本...本文讲述如何搭建 Elastic Stack 日志系统,使用的套件包括 Kibana,Elasticsearch,以及 Filebeat。搭建的环境选择阿里云 ECS 服务器,系统为 CentOS 7.4 64 位。 ...
  • 摘要:本节主要来讲解Android10.0 日志系统的架构分析,以及logd、logcat的初始化操作 阅读本文大约需要花费15分钟。 文章首发微信公众号:大猫玩程序 专注于Android系统级源码分析,Android的平台设计,欢迎...
  • 使用Docker搭建ELK日志系统

    千次阅读 2017-11-06 20:26:58
    使用Docker技术搭建ELK日志系统
  • golang elasticsearch 通用日志系统

    千次阅读 2019-05-25 21:22:00
    #日志系统说明 先来传送门: 代码传送门 1、日志主要说明:谁在什么时间,在什么地方,做了什么事情,产生了什么影响,影响的变化因子。 2、日志系统主要建设在oplogger基础上。将现有的mysql存储方式改成elastic...
  • 数据库日志系统原理详解

    万次阅读 2016-04-14 13:17:59
     日志系统原理 作者:杨万富 一:事务系统1.事务的工作模型 事务必须满足原子性,所封装的操作或者全做或者全不做。事务管理系统需要做两件事,1)让日志系统产生日志,2)保证多个事务并发执行,满足ACID特性。...
  • 日志系统ViseLog使用详解

    千次阅读 2016-12-12 22:59:02
    日志系统,使用森林对象维护不同的日志树进行日志输出,可以是Logcat树、文件树等,支持Bundle、Intent、Reference、Throwable、Map、Collection、JSON、Xml等格式化的输出。
  • 使用ElasticSearch搭建日志系统

    千次阅读 2018-02-23 13:45:03
    如果:• 你有很多台机器• 你有各种各样的Log只要满足这两个条件其中之一,那么一套日志系统是很有必要的。优秀的日志系统可以让你及时发现问题,轻松追查故障原因,进而提高生产力。本文简单介绍一下怎么用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,151
精华内容 44,460
关键字:

日志系统