我正在编写一个非常简单的Flask程序来记录POST有效负载。它在调试中运行良好,所以我将其连接到apache。现在我来了 “IOError:[Errno 13]权限被拒绝:”当尝试记录除/ tmp之外的任何地方。
我在RHEL 7.x上运行apache v2.4.6和wsgi v3.4。 这是我的东西:
vhost文件:
Listen *:8080
<VirtualHost *:8080>
ServerName www.test.com
ErrorLog /var/log/httpd/error2.log
CustomLog /var/log/httpd/access2.log combined
# didn't work
#<Directory />
# Options Indexes FollowSymLinks Includes ExecCGI
# AllowOverride All
# Require all granted
#</Directory>
WSGIDaemonProcess csplogger user=apache group=apache threads=5
WSGIProcessGroup csplogger
WSGIScriptAlias /report-to /var/www/FLASKAPPS/csplogger/csplogger.wsgi
</VirtualHost>
csplogger.wsgi文件:
#!/bin/python
import sys
sys.path.insert(0,"/var/www/FLASKAPPS/")
from csplogger import app as application
蟒蛇:
from flask import Flask, request
import json
import os
import logging
from logging import Formatter, FileHandler
from logging.handlers import RotatingFileHandler
app = Flask(__name__)
if not app.debug:
logdir = '/opt/logs/'
file_handler = FileHandler('/tmp/access.log')
#file_handler = FileHandler(logdir + 'access.log')
#file_handler = RotatingFileHandler(logdir + 'access.log', maxBytes=20000000, backupCount=10)
file_handler.setFormatter(Formatter('%(asctime)s %(levelname)s: %(message)s'))
logging.getLogger('werkzeug').setLevel(logging.INFO)
logging.getLogger('werkzeug').addHandler(file_handler)
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
# adding some debug
app.logger.info(os.environ)
app.logger.info(os.path.dirname(logdir).format())
app.logger.info(os.listdir(logdir))
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method != 'POST':
app.logger.info('GET testing'.format())
return ('not a post\n', 200)
else:
data = request.get_json()
app.logger.info(json.dumps(data))
return ('', 204)
if __name__ =='__main__':
app.run(host='0.0.0.0', port=5000, debug=False)
/ opt / logs是预期的日志目标。这是apache'd apache:apache(这是我的apache用户/组)并且perm'd open open。我知道python应用程序可以找到这些目录,因为我列出了内容并记录它(当记录到/tmp/access.log时)作为调试的一部分。我提到这是RHEL,但我没有提到SELinux已被禁用。
长话短说,我可以看到一个目录中的文件,这两个文件都是由aache用户拥有的,但是我不能写这些日志文件。
感谢您的时间。任何帮助将不胜感激。
答案 0 :(得分:0)
我遇到了这个问题,而我解决它的方式可能不是直接解决此问题的方法,但是它对我有用。
我没有配置app.logger
,而是通过日志记录包直接创建了logger:
if not app.debug:
logdir = '/opt/logs/'
file_handler = FileHandler('/tmp/access.log')
#file_handler = FileHandler(logdir + 'access.log')
#file_handler = RotatingFileHandler(logdir + 'access.log', maxBytes=20000000, backupCount=10)
file_handler.setFormatter(Formatter('%(asctime)s %(levelname)s: %(message)s'))
logging.getLogger('werkzeug').setLevel(logging.INFO)
logging.getLogger('werkzeug').addHandler(file_handler)
logger = logging.getLogger(__name__)
logger.addHandler(file_handler)
logger.setLevel(logging.INFO)
# adding some debug
logger.info(os.environ)
logger.info(os.path.dirname(logdir).format())
logger.info(os.listdir(logdir))
将app.logger
保留在原位的实际解决方案也可能与此有关。类似app.logger = logging.getLogger(__name__)
,但我自己还没有尝试过。