2017年6月

首页2017年6月
30
Jun
0

logging日志

1.简单的将日志打印到屏幕

import logging

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

屏幕上打印:
WARNING:root:This is warning message
默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。
2.通过logging.basicConfig函数对日志的输出格式及方式做相关配置
import logging

logging.basicConfig(level=logging.DEBUG,

            format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S',
            filename='myapp.log',
            filemode='w')

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message
logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
3.将日志同时输出到文件和屏幕
import logging

logging.basicConfig(level=logging.DEBUG,

            format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
            datefmt='%a, %d %b %Y %H:%M:%S',
            filename='myapp.log',
            filemode='w')

定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象

console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

屏幕上打印:
root : INFO This is info message
root : WARNING This is warning message
./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message
4.logging之日志回滚
import logging
from logging.handlers import RotatingFileHandler

定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M

Rthandler = RotatingFileHandler('myapp.log', maxBytes=1010241024,backupCount=5)
Rthandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
Rthandler.setFormatter(formatter)
logging.getLogger('').addHandler(Rthandler)

从上例和本例可以看出,logging有一个日志处理的主对象,其它处理方式都是通过addHandler添加进去的。
logging的几种handle方式如下:

logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件
日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler
logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler: 远程输出日志到UDP sockets
logging.handlers.SMTPHandler: 远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器

由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中,
上述其它处理方式的使用请参见python2.5手册!
5.通过logging.config模块配置日志

logger.conf

[loggers]
keys=root,example01,example02
[logger_root]
level=DEBUG
handlers=hand01,hand02
[logger_example01]
handlers=hand01,hand02
qualname=example01
propagate=0
[logger_example02]
handlers=hand01,hand03
qualname=example02
propagate=0

[handlers]
keys=hand01,hand02,hand03
[handler_hand01]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stderr,)
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('myapp.log', 'a')
[handler_hand03]
class=handlers.RotatingFileHandler
level=INFO
formatter=form02
args=('myapp.log', 'a', 1010241024, 5)

[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
datefmt=%a, %d %b %Y %H:%M:%S
[formatter_form02]
format=%(name)-12s: %(levelname)-8s %(message)s
datefmt=
上例3:
import logging
import logging.config

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("example01")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')
上例4:
import logging
import logging.config

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("example02")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')
6.logging是线程安全的
7.logging重定向strerr,strout
import logging
import sys

class StreamToLogger(object):
"""
Fake file-like stream object that redirects writes to a logger instance.
"""
def __init__(self, logger, log_level=logging.INFO):

  self.logger = logger
  self.log_level = log_level
  self.linebuf = ''

def write(self, buf):

  for line in buf.rstrip().splitlines():
     self.logger.log(self.log_level, line.rstrip())

logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
filename="out.log",
filemode='a'
)

stdout_logger = logging.getLogger('STDOUT')
sl = StreamToLogger(stdout_logger, logging.INFO)
sys.stdout = sl

stderr_logger = logging.getLogger('STDERR')
sl = StreamToLogger(stderr_logger, logging.ERROR)
sys.stderr = sl

print "Test to standard out"
raise Exception('Test to standard error')

We define a custom file-like object called StreamToLogger object which sends anything written to it to a logger instead. We then create two instances of that object and replace sys.stdout and sys.stderr with our fake file-like instances.
The output logfile looks like this:
2011-08-14 14:46:20,573:INFO:STDOUT:Test to standard out
2011-08-14 14:46:20,573:ERROR:STDERR:Traceback (most recent call last):
2011-08-14 14:46:20,574:ERROR:STDERR: File "redirect.py", line 33, in
2011-08-14 14:46:20,574:ERROR:STDERR:raise Exception('Test to standard error')
2011-08-14 14:46:20,574:ERROR:STDERR:Exception
2011-08-14 14:46:20,574:ERROR:STDERR::
2011-08-14 14:46:20,574:ERROR:STDERR:Test to standard error
2011-08-14 14:46:20,573:INFO:STDOUT:Test to standard out
2011-08-14 14:46:20,573:ERROR:STDERR:Traceback (most recent call last):
2011-08-14 14:46:20,574:ERROR:STDERR: File "redirect.py", line 33, in
2011-08-14 14:46:20,574:ERROR:STDERR:raise Exception('Test to standard error')
2011-08-14 14:46:20,574:ERROR:STDERR:Exception
2011-08-14 14:46:20,574:ERROR:STDERR::
2011-08-14 14:46:20,574:ERROR:STDERR:Test to standard error

28
Jun
0

增加快捷方式

创建文件
vim /usr/share/applications/pycharm.desktop
内容为
[Desktop Entry]
Encoding=UTF-8
Name=Pycharm
Comment=Pycharm
Exec=/download/pycharm-community-2017.1.4/bin/pycharm.sh
Icon=/download/pycharm-community-2017.1.4/bin/pycharm.png
Terminal=false
StartupNotify=true
Type=Application
Categories=Application;Development;

管理器打开上面的目录 把图标拖到桌面上

25
Jun
0

动态模块调用和类变量,实例变量

1.加载模块
myModule = sys.modules[modulePath]
当我们动态的加载了这个模块后,我们就可以从这个模块中取得你要的类
2.取得要加载的类
myClass= getattr(myModule, className)
3.实例化
myInstance = new.instance(myClass)
4.取属性和方法
dir(myInstance)
myInstance.__dict__
5.执行方法
apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任何参数都不会被传递,kwargs是一个包含关键字参数的字典。
myMethod = myInstance.method
returnValue = apply(myMethod,(args))

ps.类 和 实例都有自己的__dict__ 所以值不会一样 注意类变量问题

10
Jun
0

winserver2008r2 + iis7安装django

同样网上看了无数教程,但总是这个错一点那个错一点点的
结果就一直没成功
然后逞着今天空了那么一下午
下定决定再折腾下
把django跑起来,解决了静态文件问题
为了方便以后复制粘贴,就全文字,嘿嘿

废话不说,接下来直接上步骤:
1.原料python2.7.13安装包一份,安装掉
2.pip install wfastcgi
pip install django
3.此时所有原料已备齐(默认你IIS已经正常工作)
4.拷贝python安装目录C:Python27Libsite-packageswfastcgi.py到django项目的根目录(manage.py目录)
5.IIS管理器选中django网站,依次进入[处理程序映射],[添加模块映射]
请求路径 *
模块 FastCgiModule
可执行文件 C:Python27python.exe|D:Webwfastcgi.py(|前python后为步骤4的那个文件)
确定即可(请求限制:仅当请求映射至以下内容时才调用处理程序,默认就没有勾,所以直接确定就好了)
6.IIS管理器选中服务器,双击[FastCGI设置]进入,
选中刚才建立的执行文件那一条记录双击进入[编辑FastCGI设置]找到属性里面的环境变量(集合)点击进入添加三个变量
a.get_wsgi_application()方法的位置

Name: WSGI_HANDLER
Value: django.core.wsgi.get_wsgi_application()

b.Django项目目录

Name: PYTHONPATH
Value: D:\Web\              (python项目目录) 

c.项目settings.py文件的位置

Name: DJANGO_SETTINGS_MODULE
Value: shabulaji.settings   (.前面为python项目名)

7.把python项目目录的权限iis_iusrs改为完全访问
8.settings.py里的ALLOWED_HOSTS = ['www.shabulaji.cn',]有域名的话一定要设置,否则无法访问
9.回收应用池就应该已经可以访问了,接下来处理静态文件
10.settings.py里的STATIC_URL = 'static/' static前面不可以有/,否则会目录不正确
11.urls.py加入
from django.conf import settings

from django.conf.urls.static import static
urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_URL)
12.IIS管理器选中网站,添加虚拟目录static目录指向静态文件的目录
13.回收或重启网站
14.恭喜你,你的django网站跑起来了
15.好累,不过好爽,需要注意的是你项目里引用到的所有包都得先装好,如有其它问题就博客(www.zifuchuan.com)留言吧。