全栈开发知识库

日志和部署(六)

在开发Web应用程序时需要将运行过程中的各种事件一一记录下来。如果我们想把日志保存到文件,然后又能结合日志实现一些复杂的功能,可以使用第三方开发的日志系统:logrus或seelog

logrus是用Go语言实现的一个日志系统,与标准库log完全兼容并且核心API很稳定,是Go语言目前最活跃的日志库

首先安装logrus

go get -u github.com/sirupsen/logrus

然后使用:

package main

import (
    "os"

    log "github.com/Sirupsen/logrus"
)

func init() {
    // 日志格式化为JSON而不是默认的ASCII
    log.SetFormatter(&log.JSONFormatter{})

    // 输出stdout而不是默认的stderr,也可以是一个文件
    log.SetOutput(os.Stdout)

    // 只记录严重或以上警告
    log.SetLevel(log.WarnLevel)
}

func main() {
    log.WithFields(log.Fields{
        "animal": "walrus",
        "size":   10,
    }).Info("A group of walrus emerges from the ocean")

    log.WithFields(log.Fields{
        "omg":    true,
        "number": 122,
    }).Warn("The group's number increased tremendously!")

    log.WithFields(log.Fields{
        "omg":    true,
        "number": 100,
    }).Fatal("The ice breaks!")

    // 通过日志语句重用字段
    // logrus.Entry返回自WithFields()
    contextLogger := log.WithFields(log.Fields{
        "common": "this is a common field",
        "other":  "I also should be logged always",
    })

    contextLogger.Info("I'll be logged with common and other field")
    contextLogger.Info("Me too")
}

应用部署

程序开发完毕之后,我们现在要部署Web应用程序了,但是我们如何来部署这些应用程序呢?因为Go程序编译之后是一个可执行文件,编写过C程序的读者一定知道采用daemon就可以完美的实现程序后台持续运行,但是目前Go还无法完美的实现daemon,因此,针对Go的应用程序部署,我们可以利用第三方工具来管理,第三方的工具有很多,例如Supervisord、upstart、daemontools等,这小节我介绍目前自己系统中采用的工具Supervisord。

Supervisord是用Python实现的一款非常实用的进程管理工具。supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启、关闭、重启等操作,而且它管理的进程一旦崩溃会自动重启,这样就可以保证程序执行中断后的情况下有自我修复的功能。

Supervisord安装

Supervisord可以通过sudo easy_install supervisor安装,当然也可以通过Supervisord官网下载后解压并转到源码所在的文件夹下执行setup.py install来安装。

使用easy_install必须安装setuptools

打开http://pypi.python.org/pypi/setuptools#files,根据你系统的python的版本下载相应的文件,然后执行sh setuptoolsxxxx.egg,这样就可以使用easy_install命令来安装Supervisord。

Supervisord配置

Supervisord默认的配置文件路径为/etc/supervisord.conf,通过文本编辑器修改这个文件,下面是一个示例的配置文件: ;/etc/supervisord.conf [unix_http_server] file = /var/run/supervisord.sock chmod = 0777 chown= root:root

[inet_http_server]

Web管理界面设定

port=9001 username = admin password = yourpassword

[supervisorctl] ; 必须和'unix_http_server'里面的设定匹配 serverurl = unix:///var/run/supervisord.sock

[supervisord] logfile=/var/log/supervisord/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=true ; (start in foreground if true;default false) minfds=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) user=root ; (default is current user, required if root) childlogdir=/var/log/supervisord/ ; ('AUTO' child log dir, default $TEMP)

[rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

; 管理的单个进程的配置,可以添加多个program [program:blogdemon] command=/data/blog/blogdemon autostart = true startsecs = 5 user = root redirect_stderr = true stdout_logfile = /var/log/supervisord/blogdemon.log

Supervisord管理 Supervisord安装完成后有两个可用的命令行supervisor和supervisorctl,命令使用解释如下:

supervisord,初始启动Supervisord,启动、管理配置中设置的进程。 supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx为[program:blogdemon]里配置的值,这个示例就是blogdemon。 supervisorctl start programxxx,启动某个进程 supervisorctl restart programxxx,重启某个进程 supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。 supervisorctl reload,载入最新的配置文件,并按新的配置启动、管理所有进程。


  • 邮箱 :charon.chui@gmail.com
  • Good Luck!
本页由 Markdown 自动渲染 · 共 628 篇笔记