python 日志类

Python + logging 输出到屏幕,将log日志写入文件

日志

日志是跟踪软件运行时所发生的事件的一种方法。软件开发者在代码中调用日志函数,表明发生了特定的事件。事件由描述性消息描述,该描述性消息可以可选地包含可变数据(即,对于事件的每次出现都潜在地不同的数据)。事件还具有开发者归因于事件的重要性;重要性也可以称为级别或严重性。

logging提供了一组便利的函数,用来做简单的日志。它们是 debug()、 info()、 warning()、 error() 和 critical()。

logging函数根据它们用来跟踪的事件的级别或严重程度来命名。标准级别及其适用性描述如下(以严重程度递增排序):

级别 何时使用
DEBUG 详细信息,一般只在调试问题时使用。
INFO 证明事情按预期工作。
WARNING 某些没有预料到的事件的提示,或者在将来可能会出现的问题提示。例如:磁盘空间不足。但是软件还是会照常运行。
ERROR 由于更严重的问题,软件已不能执行一些功能了。
CRITICAL 严重错误,表明软件已不能继续运行了。
级别 数字值
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0

默认等级是WARNING,这意味着仅仅这个等级及以上的才会反馈信息,除非logging模块被用来做其它事情。

被跟踪的事件能以不同的方式被处理。最简单的处理方法就是把它们在控制台上打印出来。另一种常见的方法就是写入磁盘文件。

一、打印到控制台

import logging
logging.debug('debug 信息')
logging.warning('只有这个会输出。。。')
logging.info('info 信息')

由于默认设置的等级是warning,所有只有warning的信息会输出到控制台。

WARNING:root:只有这个会输出。。。

利用logging.basicConfig()打印信息到控制台

import logging
logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',
                    level=logging.DEBUG)
logging.debug('debug 信息')
logging.info('info 信息')
logging.warning('warning 信息')
logging.error('error 信息')
logging.critical('critial 信息')

由于在logging.basicConfig()中的level 的值设置为logging.DEBUG, 所有debug, info, warning, error, critical 的log都会打印到控制台。

日志级别: debug < info < warning < error < critical
logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
logging.warning('waring级别,一般用来打印警信息')
logging.error('error级别,一般用来打印一些错误信息')
logging.critical('critical 级别,一般用来打印一些致命的错误信息,等级最高')

所以如果设置level = logging.info()的话,debug 的信息则不会输出到控制台。

二、利用logging.basicConfig()保存log到文件

logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别
                    filename='new.log',
                    filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
                    #a是追加模式,默认如果不写的话,就是追加模式
                    format=
                    '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                    #日志格式
                    )

如果在logging.basicConfig()设置filename 和filemode,则只会保存log到文件,不会输出到控制台。

三、既往屏幕输入,也往文件写入log

logging库采取了模块化的设计,提供了许多组件:记录器、处理器、过滤器和格式化器。

  • Logger 暴露了应用程序代码能直接使用的接口。
  • Handler将(记录器产生的)日志记录发送至合适的目的地。
  • Filter提供了更好的粒度控制,它可以决定输出哪些日志记录。
  • Formatter 指明了最终输出中日志记录的布局。

Loggers:

Logger 对象要做三件事情。首先,它们向应用代码暴露了许多方法,这样应用可以在运行时记录消息。其次,记录器对象通过严重程度(默认的过滤设施)或者过滤器对象来决定哪些日志消息需要记录下来。第三,记录器对象将相关的日志消息传递给所有感兴趣的日志处理器。

常用的记录器对象的方法分为两类:配置和发送消息。

这些是最常用的配置方法:

Logger.setLevel()指定logger将会处理的最低的安全等级日志信息, debug是最低的内置安全等级,critical是最高的内建安全等级。例如,如果严重程度为INFO,记录器将只处理INFO,WARNING,ERROR和CRITICAL消息,DEBUG消息被忽略。
Logger.addHandler()和Logger.removeHandler()从记录器对象中添加和删除处理程序对象。处理器详见Handlers。
Logger.addFilter()和Logger.removeFilter()从记录器对象添加和删除过滤器对象。

Handlers

处理程序对象负责将适当的日志消息(基于日志消息的严重性)分派到处理程序的指定目标。Logger 对象可以通过addHandler()方法增加零个或多个handler对象。举个例子,一个应用可以将所有的日志消息发送至日志文件,所有的错误级别(error)及以上的日志消息发送至标准输出,所有的严重级别(critical)日志消息发送至某个电子邮箱。在这个例子中需要三个独立的处理器,每一个负责将特定级别的消息发送至特定的位置。

常用的有4种:

1) logging.StreamHandler -> 控制台输出

使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。

它的构造函数是:
StreamHandler([strm])
其中strm参数是一个文件对象。默认是sys.stderr

2) logging.FileHandler -> 文件输出

和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是:
FileHandler(filename[,mode])
filename是文件名,必须指定一个文件名。
mode是文件的打开方式。默认是’a',即添加到文件末尾。

3) logging.handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件

这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
其中filename和mode两个参数和FileHandler一样。
maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。

4) logging.handlers.TimedRotatingFileHandler -> 按照时间自动分割日志文件

这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
interval是时间间隔。
when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
S 秒
M 分
H 小时
D 天
W 每星期(interval==0时代表星期一)
midnight 每天凌晨

配置方法:

  • setLevel()方法和日志对象的一样,指明了将会分发日志的最低级别。为什么会有两个setLevel()方法?记录器的级别决定了消息是否要传递给处理器。每个处理器的级别决定了消息是否要分发。
  • setFormatter()为该处理器选择一个格式化器。
  • addFilter()removeFilter()分别配置和取消配置处理程序上的过滤器对象。

Formatters

Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S,下面是Formatter常用的一些信息

%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息

需求:

输出log到控制台以及将日志写入log文件。
保存2种类型的log, all.log 保存debug, info, warning, critical 信息, error.log则只保存error信息,同时按照时间自动分割日志文件。

import logging
from logging import handlers

class Logger(object):
    level_relations = {
        'debug':logging.DEBUG,
        'info':logging.INFO,
        'warning':logging.WARNING,
        'error':logging.ERROR,
        'crit':logging.CRITICAL
    }#日志级别关系映射

    def __init__(self,filename,level='info',when='D',backCount=3,fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
        self.logger = logging.getLogger(filename)
        format_str = logging.Formatter(fmt)#设置日志格式
        self.logger.setLevel(self.level_relations.get(level))#设置日志级别
        sh = logging.StreamHandler()#往屏幕上输出
        sh.setFormatter(format_str) #设置屏幕上显示的格式
        th = handlers.TimedRotatingFileHandler(filename=filename,when=when,backupCount=backCount,encoding='utf-8')#往文件里写入#指定间隔时间自动生成文件的处理器
        #实例化TimedRotatingFileHandler
        #interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
        # S 秒
        # M 分
        # H 小时、
        # D 天、
        # W 每星期(interval==0时代表星期一)
        # midnight 每天凌晨
        th.setFormatter(format_str)#设置文件里写入的格式
        self.logger.addHandler(sh) #把对象加到logger里
        self.logger.addHandler(th)
if __name__ == '__main__':
    log = Logger('all.log',level='debug')
    log.logger.debug('debug')
    log.logger.info('info')
    log.logger.warning('警告')
    log.logger.error('报错')
    log.logger.critical('严重')
    Logger('error.log', level='error').logger.error('error')

屏幕上的结果如下:

2018-03-13 21:06:46,092 - D:/write_to_log.py[line:25] - DEBUG: debug
2018-03-13 21:06:46,092 - D:/write_to_log.py[line:26] - INFO: info
2018-03-13 21:06:46,092 - D:/write_to_log.py[line:27] - WARNING: 警告
2018-03-13 21:06:46,099 - D:/write_to_log.py[line:28] - ERROR: 报错
2018-03-13 21:06:46,099 - D:/write_to_log.py[line:29] - CRITICAL: 严重
2018-03-13 21:06:46,100 - D:/write_to_log.py[line:30] - ERROR: error

由于when=D,新生成的文件名上会带上时间,如下所示。

img

2019/7/16 posted in  python

2019 前后端学习路径

2019前端学习路径图

后端学习路径

DevOPS 路径

2019/6/20 posted in  python

Python 入门图

0001

0002

2019/2/23 posted in  python

wechat-scrawle 配置指南记录

环境配置指南

1. 安装mongodb / redis / elasticsearch

安装MongoDB

具体的mongodb配置见下面这篇文章

mongodb

安装redis

具体的安装redis参考这篇
redis 使用

安装elasticsearch

mac安装elasticsearch

安装 elasticsearch-ik中文分词器

下载 elasticsearch-analysis-ik-5.1.1.zip (注意:和elasticsearch版本对应),直接下载其release的版本(第一个zip文件,避免maven打包)
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v5.1.1
(可以选一个比较新的版本下载)

在/Users/duhuifang/Downloads/elasticsearch-5.1.1/plugins下建立ik目录
mkdir ik

移动 elasticsearch-analysis-ik-5.1.1.zip至elasticsearch的plugins文件夹的ik文件夹下:

cp Downloads/ elasticsearch-analysis-ik-5.1.1.zip /Users/duhuifang/Downloads/elasticsearch-5.1.1/plugins/ik

解压文件
unzip elasticsearch-analysis-ik-5.1.1.zip

启动elasticsearch,即可看到加载了analysis-ik插件

完成之后可以使用postman进行测试

POST http://localhost:9200/_analyze

body

{
  "analyzer":"ik_max_word",
  "text":"中华人民共和国国歌"
}

2. Install proxy server and run proxy.js

使用npm安装anyproxy

3. 安装python包

起virtualenv环境

使用pip install -r requirements.txt 来安装
注意里面有个windows的依赖包可以删掉

4. 安装adb

安装android SDK,这里不多说了

安装NOX或者mumu,这里我安装的mumu,NOX现在微信不能访问了。

要起的哪几个内容

node proxy.js
redis-server /usr/local/etc/redis.conf
python3 ./main.py
sudo mongod
2019/1/21 posted in  python

Modern Backend and Frontend Developer in 2018

Modern Backend Developer in 2018

后端语言学习路径

Modern Backend Developer in 2018

  1. 选择一门语言
  2. 写入门实践代码 —— 用最简单的方式最快的学习去实践如何写
  3. 学习包管理工具 —— python pip。 基本上每种语言都有包管理工具
  4. 了解语言的开发标准和开发规范 —— 比如python的PEP8或者black
  5. 自己写一些包或者去给一些包做分支 —— 可以自己写一些包去开源,做好之后可以给一些开源软件贡献代码
  6. 学习测试 —— 给自己的项目做单元测试和集成测试
  7. 写测试用例并使用到实践当中
  8. 学习关系数据库 —— 学习使用一种关系数据库
  9. 实践实践 —— 使用学到的所有东西创建一个应用,例如blog等
  10. 学习一个框架
  11. 学习一个NoSQL数据库 —— MongoDB
  12. 学习缓存 —— redis或者memcache
  13. 创建RestfulAPI
  14. Authentication 鉴权方式
  15. 学习消息队列 —— 知道为什么要使用消息队列,怎么使用
  16. 学习一个搜索引擎 —— ElasticSearch、sola
  17. 学习怎么使用docker
  18. 学习如何使用WebServer
  19. 学习如何使用Web Socket
  20. 学习 GraphQL
  21. 学习 Graph Database
  22. 学习其他部分 —— profilling, Static Analyse, DDD, SOAP 等等
  23. 持续学习

前端学习路径

Modern Frontend Developer in 2018

  1. 学习HTML
  2. CSS基础
  3. Javascript基础
  4. 使用javascript做一些交互式网站和一些简单的交互
  5. 在github上面找一个开源项目并提一些SR需求
  6. 为自己找一个合适职业
  7. 包管理 —— npm、yarn
  8. 为你的应用装一些第三方依赖
  9. CSS 预处理组件 —— Sass Less等
  10. 学习CSS框架 —— Bootstrap
  11. CSS架构 —— BEM
  12. 构建工具 —— webpack、NPM Scripts、 Gulp
  13. 做点东西 —— 简单的做一些实践
  14. 选一个框架 —— vue, react, angular
  15. 实践 —— 开始做一些小项目进行实践
  16. 测试你的APP ——
  17. progressive Webapps
  18. js静态检查 —— TypeScript
  19. 学习服务端渲染
  20. 学习其他内容 —— canvas, HTML-5, SVG, sourcemaps, functional programming等
  21. 持续学习
2019/1/19 posted in  python

少儿编程

西瓜创客

scratch

现在大多数平台的少儿编程教育都以scratch为基础平台来进行,无非就是在上面针对不同的部分进行二次开发。
类似西瓜创客的做法就是针对scratch做一个多少小时的培训,引导小朋友做出自己的相应的程序来进行发布,提升小朋友对于编程的喜爱,然后逐步的开放小朋友对于编程的热爱

scratch可以教会小朋友:

  1. 画画的能力
  2. 制作语音的能力
  3. 创意
  4. 基础的编程实现创意能力

不同年龄的孩子如何学习编程

小马王少儿编程

kano
一个使用树莓派将儿童玩具作为议题的公司,软件类似使用scratch类似的模式,然后添加上一些sensor之类的内容。方便孩子所见即所得的获取编程快乐

2019/1/14 posted in  python

爱湃森2018年度python榜单

爱湃森2018年度python榜单

python star 数最多的项目
awesome-python

系统设计教程
这是一个很好的教程,从这个教程可以学到几个东西

  1. 所有教程都形成了anki库,通过anki工具更方便后面的学习
  2. 各种不同系统的架构设计方式,包括各种不同的设计方式

Tensorflow modles
TensorFlow的一些不同模型的实现和一些样例教程,适合入门学习

public-apis
整理了线上的很多公共可以使用的API

awesome-machine-learning
机器学习的相关比较好的代码库

2018年最受欢迎的python项目

cerbot let's encrypt 用于全站https加密的网站

参考这篇网站可以配置自己的网站到https

Detectron
facebook开源的机器学习动态监测API,使用python开发,使用caffe2深度学习框架

pipenv
pipenv 现在资料比较多了,可以好好整理一下

sanic
sanic一个新的异步框架

2018爬虫框架

  1. scrapy
  2. pyspider
  3. python-spider
  4. photon
  5. lianjia-scrawler
  6. Weixin-crawler 非常值得研究一下
  7. rula
  8. Instagram-scraper
  9. Weibo-Spider
  10. Haipproxy

2018年需要学习的python项目

black
Black号称不妥协的代码格式化工具,为什么叫不妥协呢?因为它检测到不符合规范的代码风格直接就帮你全部格式化好,根本不需要你确定,直接替你做好决定。它也是 requests 作者最喜欢的工具之一.使用非常简单,安装成功后,和其他系统命令一样使用,只需在 black 命令后面指定需要格式化的文件或者目录就ok。
在pycharm里面也可以集成black。

wtfpython
这个可以好好了解一下,python一些神奇的东西

photon
一个爬虫框架

python入门书籍

2019/1/12 posted in  python

redash 开发数据库连接

直接连接数据库

psql -U root -d redash

docker模式的连接数据库

root@firephoenix:~# docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
4e200be3f2fe        redash_worker           "/app/bin/docker-ent…"   8 weeks ago         Up 8 weeks          5000/tcp                 redash_worker_1
a0b6f27748c1        redash_server           "/app/bin/docker-ent…"   8 weeks ago         Up 8 weeks          0.0.0.0:5000->5000/tcp   redash_server_1
7ab477c2aacd        postgres:9.5.6-alpine   "docker-entrypoint.s…"   8 weeks ago         Up 8 weeks          5432/tcp                 redash_postgres_1
1b03f712e99e        redis:3.0-alpine        "docker-entrypoint.s…"   8 weeks ago         Up 8 weeks          6379/tcp                 redash_redis_1
root@firephoenix:~#
root@firephoenix:~#
root@firephoenix:~#
root@firephoenix:~# docker exec -t -i redash_postgres_1 /bin/bash
bash-4.3#

2019/1/10 posted in  python

mac上安装python3 的两种环境配置方法和分析

mac上一般可以使用homebrew来管理多个版本的python,现在python的两个版本分化的比较明显,所以现在实际上两个版本一般都在使用。

使用homebrew来安装python之后python一般都会安装在

williamtekiMacBook-Pro:~ valentine$ which python3
/usr/local/Cellar/python/3.6.4_2/bin//python3

在Cellar目录下,如果在不加配置的时候使用python的话,需要到这个目录,这个实在有点复杂。

配置执行目录有两种方法,一种是将这个目录添加到PATH中去,另外一种是修改系统的执行目录。

方法一:

修改 ~/.bash_profile文件,系统每次在启动的时候都会调用这个文件来初始化环境变量,所以可以直接在里面添加

export PATH=/usr/local/Cellar/python/3.6.4_2/bin/:${PATH}

不用担心,其他的环境变量一般也会配置在这个地方

方法二:

修改系统的可执行环境目录,/etc/paths
并且修改其中的相应环境变量顺序。

2018/12/15 posted in  python

uwsgi的ini配置方法

在前面的文章使用xml的方式配置的uwsgi容器,但是xml方式可以配置的参数较少,而且配置比较老,现在修改成为使用ini方式配置

配置文件如下:

[uwsgi]
chdir = /opt/destiny/destiny-core
home = /opt/destiny/destinyenv
module = destiny.wsgi:application
#wsgi-file = /opt/destiny/destiny-core/django_uwsgi.py

master = true
processes = 2
enable-threads = true

# use unix socket because it is more secure and faster than TCP socket
socket = %(chdir)/uwsgi/uwsgi-destiny.sock
status = %(chdir)/uwsgi/uwsgi-destiny.status
pidfile = %(chdir)/uwsgi/uwsgi-destiny.pid
daemonize = %(chdir)/uwsgi/uwsgi.log


chmod-socket = 662
vacuum = true
die-on-term = true

logto = %(chdir)/uwsgi/uwsgi-destiny.log

env = LANG=en_US.UTF-8
env = LC_ALL=en_US.UTF-8
env = PYTHONIOENCODING=UTF-8

# 如果不加最后两行会报错 UnicodeEncodeError: 'ascii' codec can't encode character

nginx配置如下

server {
    listen   80;
    listen   443 ssl;
    charset utf-8;
    server_name  destiny.wonderfultop.com;
    access_log  /var/log/nginx/destiny/access.log;
    error_log   /var/log/nginx/destiny/error.log;

    proxy_http_version 1.1;
    proxy_set_header Connection "";

    ssl on;
    ssl_certificate /opt/destiny/config/Nginx/*.crt;
    ssl_certificate_key /opt/destiny/config/Nginx/*.key;

    location / {

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        include uwsgi_params;
        uwsgi_pass_request_body on;
        uwsgi_pass_request_headers on;
        uwsgi_pass  unix:/opt/destiny/destiny-core/uwsgi/uwsgi-destiny.sock;
        uwsgi_read_timeout 1800;
        uwsgi_send_timeout 300;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        sendfile        on;
        client_max_body_size 20M;
        keepalive_timeout  0;
    }


    location /static/ {
        alias /opt/destiny/destiny-core/static/;
    }
}
#启动

uwsgi --ini uwsgi_destiny.ini

#退出
kill
2018/11/22 posted in  python

redash dashboard修改指南

# dashboard展示页面在这里
redash/redash/client/app# vi pages/dashboards/dashboard.html

# 修改dashboard中放置图形化内容的区域
/home/yourwilliam/workspace/redash/redash/client/app# vi components/dashboards/widget.html


2018/11/18 posted in  python

redash 前台开发指南

前台开发指南

redash 开发中需要起三个进程,webserver、celery和webpack ,三个的启动方式如下

#Web server: 
bin/run ./manage.py runservrer --debugger --reload
#Celery: 
./bin/run celery worker --app=redash.worker --beat -Qscheduled_queries,queries,celery -c2
#Webpack dev server: 
npm run start

前台开发直接修改webpeck即可,启动不使用npm run start,而是使用npm run watch

相应的开发内容在前面的文档里面已经整理过了

发布方式

当前没有使用docker开发模式,而是使用本地安装后开发,开发之后上传到git,然后再在生产环境docker上面进行发布

dashboard黑色主题修改

修改路径:

  1. 研究出来具体的修改点,在dashboard修改点配置完成
  2. 将修改点析出,改为配置化

修改路径

  • 修改dashboard的背景
    root@yourwilliam-ubuntu:/home/yourwilliam/workspace/redash/redash/client/app# vi pages/dashboards/dashboard.html

添加bg-black

  • 修改具体的widget的background

root@yourwilliam-ubuntu:/home/yourwilliam/workspace/redash/redash/client/app# vi components/dashboards/widget.html

添加bg-black

  • 修改具体的图表的背景透明

修改处

root@yourwilliam-ubuntu:/home/yourwilliam/workspace/redash/redash/client/app# vi visualizations/chart/plotly/utils.js

  • 修改顶部的头背景

root@yourwilliam-ubuntu:/home/yourwilliam/workspace/redash/redash/client/app# vi pages/dashboards/dashboard.html

2018/11/17 posted in  python

Redash 安装脚本

REDASH_BASE_PATH=/opt/redash

install_docker(){
    # Install Docker
    sudo apt-get update
    sudo apt-get -yy install apt-transport-https ca-certificates curl software-properties-common wget pwgen
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    sudo apt-get update && sudo apt-get -y install docker-ce

    # Install Docker Compose
    sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose

    # Allow current user to run Docker commands
    sudo usermod -aG docker $USER
}

第一句把base目录配置死了配置到/opt/redash目录,如果要改目录不是改这里就可以了的,下面别的地方也写死了一些目录的结构。

第一部分主要是安装docker容器,并安装docker-compose编排组件。

create_directories() {
    if [[ ! -e $REDASH_BASE_PATH ]]; then
        sudo mkdir -p $REDASH_BASE_PATH
        sudo chown $USER:$USER $REDASH_BASE_PATH
    fi

    if [[ ! -e $REDASH_BASE_PATH/postgres-data ]]; then
        mkdir $REDASH_BASE_PATH/postgres-data
    fi
}

创建/opt/redash/和/opt/redash/postgres-data目录

create_config() {
    if [[ -e $REDASH_BASE_PATH/env ]]; then
        rm $REDASH_BASE_PATH/env
        touch $REDASH_BASE_PATH/env
    fi

    COOKIE_SECRET=$(pwgen -1s 32)
    POSTGRES_PASSWORD=$(pwgen -1s 32)
    REDASH_DATABASE_URL="postgresql://postgres:${POSTGRES_PASSWORD}@postgres/postgres"

    echo "PYTHONUNBUFFERED=0" >> $REDASH_BASE_PATH/env
    echo "REDASH_LOG_LEVEL=INFO" >> $REDASH_BASE_PATH/env
    echo "REDASH_REDIS_URL=redis://redis:6379/0" >> $REDASH_BASE_PATH/env
    echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $REDASH_BASE_PATH/env
    echo "REDASH_COOKIE_SECRET=$COOKIE_SECRET" >> $REDASH_BASE_PATH/env
    echo "REDASH_DATABASE_URL=$REDASH_DATABASE_URL" >> $REDASH_BASE_PATH/env
}

配置ENV文件,把这几个相关数据都写入env配置文件中

setup_compose() {
    REQUESTED_CHANNEL=stable
    LATEST_VERSION=`curl -s "https://version.redash.io/api/releases?channel=$REQUESTED_CHANNEL"  | json_pp  | grep "docker_image" | head -n 1 | awk 'BEGIN{FS=":"}{print $3}' | awk 'BEGIN{FS="\""}{print $1}'`

    cd $REDASH_BASE_PATH
    REDASH_BRANCH="${REDASH_BRANCH:-master}" # Default branch/version to master if not specified in REDASH_BRANCH env var
    wget https://raw.githubusercontent.com/getredash/redash/${REDASH_BRANCH}/setup/docker-compose.yml
    sed -ri "s/image: redash\/redash:([A-Za-z0-9.-]*)/image: redash\/redash:$LATEST_VERSION/" docker-compose.yml
    echo "export COMPOSE_PROJECT_NAME=redash" >> ~/.profile
    echo "export COMPOSE_FILE=/opt/redash/docker-compose.yml" >> ~/.profile
    export COMPOSE_PROJECT_NAME=redash
    export COMPOSE_FILE=/opt/redash/docker-compose.yml
    sudo docker-compose run --rm server create_db
    sudo docker-compose up -d
}

获取网上的redash-compose.py文件,export相应的配置项,同时创建数据库。
使用docker-compose up -d 将所有配置和数据文件同步。

2018/11/14 posted in  python

redash docker deploy

redash官方提供了基于docker下面的deploy文档,在目录setup下面。https://github.com/yourwilliam/redash/tree/master/setup

这份脚本是基于ubuntu18.04的,建议在ubuntu18下面进行安装部署

具体使用步骤如下:

1. 切换apt源

ubuntu18 版本安装完成之后发现里面并没有包含所有的官方源,最好是切换到国内的源,这样速度也更快。

修改/etc/apt/sources.list文件,记得最好把这个文件备份一个,方便后面修复。

中科大源

deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

然后执行命令:

sudo apt-get update
sudo apt-get upgrade

也可以使用其他的源,如下

阿里源

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

163源

deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse

清华源

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

git clone 下载

注意脚本里面很多东西都写了绝对目录,默认认为redash在目录 /opt/redash下,所以也是在opt目录下面进行git clone可以指定到对应的路径下。尽量不要自己修改目录,否则要修改的地方会很多。

执行setup/setup.sh文件

执行setup文件就可以安装

docker配置

在docker中检查当前网络状况要使用ping命令的时候,有时候由于没有安装无法使用,这时候可以自己安装

#1. 首先一定要更新源

apt-get update

#2. 安装工具包

apt-get install vim      # 安装vim

 apt-get install  telnet  # 安装telnet 

 apt-get install  net-tools  # 安装ifconfig 

apt install iputils-ping  # 安装ping

通过root进入docker容器

docker exec -i -t -u 0 e575dad3beae /bin/bash
# 其中e575dad3beae 通过docker ps获取

问题

问题1:

直接安装后,会出现一个权限不足的问题,页面无法访问

是由于在docker中执行npm build 和 npm start的时候是使用的redash用户,而不是root用户,所有数据库无法连接,同时很多文件没有权限访问

当前解决办法:

通过docker ps查询所在使用的容器实例,找到实例id。然后通过root进入到docker中执行命令docker exec -i -t -u 0 e575dad3beae /bin/bash,进去之后重新执行upm build 和 npm start即可。

问题2:

使用Nginx解析到5000端口之后无法登陆。

状态是访问 api目录的时候返回502.
返回结果,报错为:
It seems like we encountered an error. Try refreshing this page or contact your administrator.

使用docker-compose up看日志,没有看到系统的错误日志,返回都是200。那么应该是前端的错误。找到Nginx错误日志,返回以下结果:

2018/11/12 18:57:10 [error] 2002#0: *26219243 upstream sent too big header while reading response header from upstream, client: 61.183.143.20, server: bi2.hansap.com, request: "GET /api/organization/status HTTP/1.1", upstream: "http://*.*.*.*:5000/api/organization/status", host: "*******", referrer: "http://*******/"

从这里看那么就可以说明应该是Proxy配置问题,需要添加配置:

server {

        listen       80;
        server_name  **********;

        gzip on;
        gzip_types *;
        gzip_proxied any;

        location / {
            proxy_pass http://***.***.***.***:5000/;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
            #proxy_pass_request_body on;
            client_max_body_size 100m;
            proxy_redirect off;
            proxy_buffer_size 64k;
            proxy_buffers   32 32k;
            proxy_busy_buffers_size 128k;
        }
    }

完成之后重新load就可以访问了。

问题3 配置邮件

开发环境的配置文件在 /opt/redash/.env 下,正式环境的配置文件在/opt/redash/env下

但是如果是docker安装,docker会默认读取docker的环境变量,所以在/opt/redash/env下的环境变量不会生效(不知道官网怎么这么写,害人啊) 具体的可以参看

官网 https://redash.io/help/open-source/setup 官网的作为参考,按这个配置不能生效

解决问题的帖子 https://discuss.redash.io/t/where-is-opt-redash-env/999

原因是docker的环境变量需要写在docker compose的配置文件内,内部才能读取。所以这里的env 仅仅只是一个参考,修改了也是没有效果的

具体配置如下:

# /opt/redash/docker-compose.yml文件

version: '2'
services:
  server:
    build: .
    command: dev_server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
    volumes:
      - ".:/app"
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_MAIL_SERVER: "smtp.hansap.com"
      REDASH_MAIL_PORT: 25
      REDASH_MAIL_USE_TLS: "false"
      REDASH_MAIL_USE_SSL: "false"
      REDASH_MAIL_USERNAME: "*****"
      REDASH_MAIL_PASSWORD: "*****"
      REDASH_MAIL_DEFAULT_SENDER: "hansap@hansap.com"
      REDASH_HOST: "http://bi2.hansap.com"
  worker:
    build: .
    command: scheduler
    volumes_from:
      - server
    depends_on:
      - server
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      QUEUES: "queries,scheduled_queries,celery"
      WORKERS_COUNT: 2
      REDASH_MAIL_SERVER: "smtp.hansap.com"
      REDASH_MAIL_PORT: 25
      REDASH_MAIL_USE_TLS: "false"
      REDASH_MAIL_USE_SSL: "false"
      REDASH_MAIL_USERNAME: "******"
      REDASH_MAIL_PASSWORD: "******"
      REDASH_MAIL_DEFAULT_SENDER: "hansap@hansap.com"
      REDASH_HOST: "http://bi2.hansap.com"
      
      ...
2018/11/12 posted in  python

npm 切换淘宝镜像

一次修改

npm install -gd express --registry=http://registry.npm.taobao.org

永久设置

npm config set registry http://registry.npm.taobao.org
2018/11/12 posted in  python