Date Tags stream

使用全局命名的流,实现虚拟的日志埋点,只有在需要使用日志的时候,定义日志流的具体实现,那些虚的日志埋点,才会真的有意义。

建立虚的日志埋点

In [1]:
from naja import *
debug = namedstream('debug')
error = namedstream('error')
bus = namedstream('bus')
In [2]:
for i in range(10):
    i>>debug
    i*2>>error

上面的代码没有任何的输出,因为debug和error只是虚拟埋点

定义日志实现

我们在另外的模块中可以用以下代码获取到全局统一的日志流

In [3]:
debug_in_other_moudel =  namedstream('debug')
debug is debug_in_other_moudel
Out[3]:
True

这里定义debug的具体实现,对error不做处理。

我们对debug日志做两种处理,一是输出到日志文件中,一是打印到屏幕

In [4]:
#输出到文件
import moment
debug.map(lambda x:str(moment.now().datetime)+':::'+str(x)+'\n').sink(write_to_file('/tmp/tmp.log'))

def debug_print(x):
    print('debug:',x)
#在屏幕上打印    
debug.sink(debug_print)

重新执行前面的代码

In [5]:
for i in range(10):
    i>>debug
    i*2>>error
debug: 0
debug: 1
debug: 2
debug: 3
debug: 4
debug: 5
debug: 6
debug: 7
debug: 8
debug: 9

可以看到debug有了输出,而error因为没有定义具体实现,所以没有输出

我们再查看日志文件,里面的日志也是ok的

In [6]:
#查看日志文件
open('/tmp/tmp.log').readlines()
Out[6]:
['2019-01-09 21:34:53.539358:::0\n',
 '2019-01-09 21:34:53.540329:::1\n',
 '2019-01-09 21:34:53.541799:::2\n',
 '2019-01-09 21:34:53.542608:::3\n',
 '2019-01-09 21:34:53.545837:::4\n',
 '2019-01-09 21:34:53.547661:::5\n',
 '2019-01-09 21:34:53.549803:::6\n',
 '2019-01-09 21:34:53.551210:::7\n',
 '2019-01-09 21:34:53.552694:::8\n',
 '2019-01-09 21:34:53.554038:::9\n']

实现钉钉消息发送

In [7]:
from Send import DD
In [8]:
dd= DD()
'hello world'>>dd('张建伟')

只要在任何地方将数据压入dd('张建伟')这个流,钉钉都会收到提醒