Linux服务器上flask程序写文件报错PermissionError: [Errno 13] Permission denied: '/app.log'
fh = logging.handlers.TimedRotatingFileHandler('app.log', when='midnight', backupCount=7, encoding='utf-8')
本地测试正常。会在app.py的同级目录下创建app.log文件并写入。
本地flask项目目录,生成app.log
但在服务器启动该程序时,却报错PermissionError: [Errno 13] Permission denied: '/app.log'
。bai了谷了一大堆,都是告诉你打开的是文件夹不是文件要么就是Windows的。唉。
最后受到同事启发,弄到日志目录下,遂改成下面的绝对路径。当当当当~done
fh = logging.handlers.TimedRotatingFileHandler('/var/log/android-bug-search/app.log', when='midnight', backupCount=7, encoding='utf-8') #创建一个文件流并设置编码utf8
当然也要对/var/log/android-bug-search/
授予写权限。 直接sudo chmod -R 777 /var/log
最后分析原因应该是线上运行的项目是不能写文件到自己的目录下。(应该也和服务器的环境有关。)
flask的logger使用过程问题
app.logger
只能使用在app.py的视图函数中。 其他普通py文件不能使用app.logger,报错importError
。(因为其他py需要import app, 而app.py还需要import 这些py,造成循环依赖的问题)
使用current_app
。current_app只能在flask的APP启动后还能使用current_app。而且出了个这么个问题:
# 日志系统配置
handler = logging.FileHandler('app.log', encoding='UTF-8')
logging_format = logging.Formatter(
'%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
handler.setFormatter(logging_format)
app.logger.addHandler(handler)
@app.route('/')
def index():
current_app.logger.debug('xxx')
这样编写,current_app并不会将log重定向写到app.log中,还是输出在控制台。
最后我的做法是在app.py中直接在头部执行如下
fh = logging.handlers.TimedRotatingFileHandler('/var/log/android-bug-search/app.log', when='midnight', backupCount=7, encoding='utf-8') #创建一个文件流并设置编码utf8
logger = logging.getLogger() #获得一个logger对象,默认是root
logger.setLevel(logging.DEBUG) #设置最低等级debug
fm = logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s - func:%(funcName)s - [line:%(lineno)d] -- %(message)s") #设置日志格式
logger.addHandler(fh) #把文件流添加进来,流向写入到文件
fh.setFormatter(fm) #把文件流添加写入格式
最后所有py文件都用current_app.logger.xxx打log,都保存到了app.log文件中
from flask import current_app
# 连接数据库
def connectDB(self):
try:
self.db = pymysql.connect(host=self.host, user=self.user, password=self.password, database=self.database,
port=self.port, charset='utf8')
self.cursor = self.db.cursor()
except pymysql.Error as error:
current_app.logger.error('connect mysql error - %s', error)
最后给个建议,flask的app只在app.py中使用,用于做flask项目全局的配置,不要用于其他。
还有一种日志方式,就是写个单例的日志文件使用。
连接mysql,pymysql有时会报无法连接到localhost
self.host = "localhost" # localhost ,pymysql有时会报无法连接到localhost
我在Mac本机上连接Mysql,有时连接不到localhost,改成127.0.0.1一切正常。但上线linux服务器后使用Localhost未发现异常。
python无法解析单引号json
我在azkanban用shell+python脚本获取Hive数据时,处理得到元组d,然后json.dumps(d)得到json,该json就是单引号格式的,传到服务器后,服务器程序调用json.loads(json)时,报错decodeError。
解决方案:
data = request.get_data()
dic = eval(data) # eval() 可以解决单引号json的问题
pymysql.err.InterfaceError: (0, '')
我这里发现这两种操作,会触发该异常
- 未连接数据库,但执行了pymysql.insert等增删改查操作
- 每次连接不关闭,长时间断开会报该异常
html <a>标签设置点击效果
.html
<a style="width:100%;margin-top: 5px; font-size:1em;" href="/" group="mylink" class="my_link_button">错误趋势</a>
<a style="width:100%;margin-top: 5px; font-size:1em;" href="/error_list" group="mylink" class="my_link_button">错误列表</a>
<a style="width:100%;margin-top: 5px; font-size:1em;" href="/log_mapping" group="mylink" class="my_link_button">log mapping</a>
.js
<script>
$(function () {
$(".my_link_button").click(function () {
$("a[group='mylink']").removeClass("my_link_button_select");
$(this).addClass("my_link_button_select");
return true; //传递点击事件,使该次点击生效。必须返回true,否则超链接的URL无法跳转
});
});
</script>
.css
.my_link_button {
display: block;
width: 100px;
height: 30px;
background: #FFFAFA;
margin-top: 20px;
font-size: 8px;
text-decoration: none;
text-align: center;
line-height: 28px;
color: #999999;
}
.my_link_button_select {
display: block;
width: 100px;
height: 30px;
background: #0081c2;
margin-top: 20px;
font-size: 8px;
text-decoration: none;
text-align: center;
line-height: 28px;
color: white;
}
.my_link_button:hover {
text-decoration: none;
color: white;
background: #C9C9C9;
}
网友评论