logspout 集中查看日志

logspout 可以把某宿主机上所有 docker 容器的日志集中到一起,方便用户查看,本身也可以用 docker 安装:

1
2
3
4
docker run -d --name="logspout" \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--publish=127.0.0.1:8000:80 \
gliderlabs/logspout

这样就可以在命令行查看日志了:

1
2
3
4
5
6
# 查看所有日志
curl http://127.0.0.1:8000/logs
# 查看名以 api 开头的容器的日志
curl http://127.0.0.1:8000/logs/name:api*
# 指定返回 json 格式
curl http://127.0.0.1:8000/logs/name:api* -H 'Accept: application/json'

Read More

logstash 嵌套 json

使用 json 插件,数据输入:

1
{"name":"bob","last":"builder", "atts":"{\"a\":111, \"b\":222}"}

希望得到:

1
2
3
4
5
6
7
8
{
"name": "bob",
"last": "builder",
"atts": {
"a": 111,
"b": 222
}
}

但实际得到:

1
2
3
4
5
{
"name": "bob",
"last": "builder",
"atts": "{\"a\": 111,\"b\": 222}"
}

Read More

mongodb stats

查看 MongoDB 的统计数据库信息可以用下面的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
db.stats()
{
"db" : "test", # 系统自带测试数据库
"collections" : 0, # 集合数量
"views" : 0, #
"objects" : 0, # 文档对象的个数, 所有集合的记录数之和
"avgObjSize" : 0, # 平均每个对象的大小, 通过 dataSize / Objects 得到
"dataSize" : 0, # 当前库所有集合的数据大小
"storageSize" : 0, # 磁盘存储大小
"numExtents" : 0, # 所有集合的扩展数据量统计数
"indexes" : 0, # 已建立索引数量
"indexSize" : 0, # 索引大小
"fileSize" : 0, #
"fsUsedSize" : 0, #
"fsTotalSize" : 0, #
"ok" : 1
}

其中 fsTotalSize 表示 MongoDB 存储数据的文件系统上的所有磁盘容量的总大小,而 fsUsedSize 表示用掉的磁盘空间总大小,默认都是 bytes 单位,不过该函数可接受 scale 参数来切换单位:

1
2
3
db.stats(1024) // 得到的是 k 单位的
db.stats(1024 * 1024) // 得到的是 M 单位的
db.stats(1024*1024*1024) // 得到 G 为单位 1073741824

也可以在指定表上获取统计信息:

1
db.users.stats()

服务器用流的方式传输文件

创建一个 nodejs 服务器,用于传输文件给用户,可以用下面的方法:

1
2
3
4
5
6
7
8
9
10
const fs = require('fs')
const server = require('http').createServer();

server.on('request', (req, res) => {
fs.readFile('./big.file', (err, data) => {
if (err) throw err
res.end(data)
})
})
server.listen(8000)

但是上面的方法有个弊端,就是服务器对内存的占用取决于 big.file 文件的大小,如果文件特别大的话就会导致服务器内存爆仓,更好的方式是采用流:

1
2
3
4
5
6
7
8
9
const fs = require('fs')
const server = require('http').createServer()

server.on('request', (req, res) => {
const src = fs.createReadStream('./big.file')
src.pipe(res)
})

server.listen(8000)

docker 日志收集

docker 默认的日志驱动是 json-file,即保存在文件中,路径可以通过下面的命令查看:

1
docker inspect --format='{{.LogPath}}' NAME|ID

例如:

1
2
$ docker inspect --format='{{.LogPath}}' mysql
/var/lib/docker/containers/54571b675a6b52f70aea806977359d8bcd74543cb09e1aa139853113f835d1c4/54571b675a6b52f70aea806977359d8bcd74543cb09e1aa139853113f835d1c4-json.log

json-file 驱动会在启动某个容器时自动创建一个 json 文件,用于存储容器 stdout 与 stderr 输出的内容 ,当在宿主机中运行 docker logs -f 容器名 时,就会读取该文件的内容并显示在终端上。

Read More

git 删除和重命名分支

本地分支重命名

1
git branch -m old new

删除本地分支

1
git branch -D 本地分支名

远程分支重命名

  • 删除远程分支

    1
    git push origin  :远程分支名(你要删除的远程分支名)
  • 将本地分支推送到远程分支上,如果远程分支不存在,则创建此远程分支

    1
    git push origin  本地分支名:远程分支名

如果其他开发者已经删除了远程分支,但本地 git branch -a 依然显示,用 git fetch -p 即可

require 时报错 not a constructor

当引用第三方库的时候,经常会遇到下面的错误:

1
xxx is not a constructor

原因是该第三方库使用 es6 语法暴露出来一个类,但是在项目中使用了 require 来引用导致的。这是 babel 在转换 importexportrequireexports 时存在的差异,举个例子,用 es6 写 processor.js 暴露一个类:

1
2
3
4
5
// processor.js
class Processor {
}

export default Processor

如果用 require 来引用:

1
2
3
// require.js
const Processor = require('./processor');
const processor = new Processor() // 会报错

Read More

sudo 保持环境变量

sudo 之后环境变量就没了,但有个 -E 选项能够保持环境变量:

1
2
$ export HTTP_PROXY=foof
$ sudo -E bash -c 'echo $HTTP_PROXY'

帮助页面解释如下:

1
-E, --preserve-env

Indicates to the security policy that the user wishes to preserve their existing environment variables. The security policy may return an error if the user does not have permission to preserve the environment.