পাইথন / জ্যাঙ্গো: রানারভারের অধীনে কনসোলে লগইন করুন, অ্যাপাচে অধীনে ফাইল লগ করুন


114

আমি printযখন আমার জ্যাঙ্গো অ্যাপ্লিকেশনটি চালাচ্ছি তখন কীভাবে কনসোলটিতে (যেমন ) ট্রেস বার্তা প্রেরণ করতে পারি manage.py runserver, তবে আমি যখন অ্যাপাচের অধীনে অ্যাপটি চালাচ্ছি তখন কোনও বার্তা লগ ফাইলে প্রেরণ করা যায়?

আমি জ্যাঙ্গো লগিং পর্যালোচনা করেছি এবং যদিও আমি এর নমনীয়তা এবং উন্নত ব্যবহারের জন্য কনফিগারেশনে মুগ্ধ হয়েছি, তবে এখনও আমার সাধারণ ব্যবহারের ক্ষেত্রে কীভাবে পরিচালনা করতে হয় তা নিয়ে আমি স্তব্ধ হয়ে পড়েছি।


1
প্রধান সমাধানটি হ'ল মূল সার্ভার এবং বিকাশের পরিবেশের জন্য বিভিন্ন সেটিংস.পি
অ্যালেক্স

উত্তর:


84

স্ট্যাডারে মুদ্রিত পাঠ্য মোড_উজগির অধীনে চলার সময় httpd এর ত্রুটি লগতে প্রদর্শিত হবে। আপনি হয় printসরাসরি ব্যবহার করতে পারেন , বা loggingপরিবর্তে ব্যবহার করতে পারেন ।

print >>sys.stderr, 'Goodbye, cruel world!'

2
এটি প্রযুক্তিগতভাবে ডাব্লুএসজিআই বৈধ নয় তবে আরও কঠোর পরিবেশে ত্রুটিগুলি ট্রিগার করবে।
পল ম্যাকমিলান

13
ডাব্লুএসজিআই যতদূর যায় 'sys.stderr' এর সাথে 'মুদ্রণ' ব্যবহার করে যা কিছু ভুল হয় না এবং ত্রুটিগুলি ট্রিগার করা উচিত নয়।
গ্রাহাম ডাম্পলটন

আমি সিস আমদানি করেছিলাম তবে এটি আমার পক্ষে কাজ করে না বলে মনে হচ্ছে।
হ্যাক-আর

17
পাইথন 3 এ এটি কাজ করে না এখানে এখানে দেখুন । আপনি প্রয়োজনprint("Goodbye cruel world!", file=sys.stderr)
এলাচ

103

এখানে একটি জ্যাঙ্গো লগিং-ভিত্তিক সমাধান। এটি আপনি ডেভলপমেন্ট সার্ভারটি চালাচ্ছেন কিনা তা যাচাই করার পরিবর্তে এটি ডিইবিইউজি সেটিং ব্যবহার করে তবে আপনি যদি এটির জন্য আরও ভাল উপায় খুঁজে পান তবে এটি খাপ খাইয়ে নেওয়া সহজ হওয়া উচিত।

LOGGING = {
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/your/file.log',
            'formatter': 'simple'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

if DEBUG:
    # make all loggers use the console.
    for logger in LOGGING['loggers']:
        LOGGING['loggers'][logger]['handlers'] = ['console']

বিশদ জানতে https://docs.djangoproject.com/en/dev/topics/logging/ দেখুন।


8
এছাড়াও চেষ্টা করুনLOGGING['loggers'][logger]['handlers'] += ['console']
নীর লেভি

@ এম01: এটিকে সেটিংস.পিতে কনফিগার করার পরে কীভাবে এটি মুদ্রণের উদ্দেশ্যে ব্যবহার করবেন? ধন্যবাদ
নিকস জৈন

আমি আমার উত্তর থেকে কোডটি settings.pyনীচের দিকে আমার দিকে রেখেছি এবং সেট করেছি DEBUG = True(একই ফাইলের শীর্ষের কাছাকাছি সেটিংটি দেখুন)। তারপরে, আমি python manage.py runserverএকটি টার্মিনাল থেকে চালাচ্ছি (বিশদগুলির জন্য জাজানো ডক্স দেখুন), এবং লগ বার্তা টার্মিনাল উইন্ডোতে উপস্থিত হবে। উত্পাদনে, আমি একটি আলাদা সেটিংস.পি ব্যবহার করব, যেখানে DEBUG = False- লগ বার্তাগুলিতে যায় /path/to/your/file.log
m01

আপনার ইন্ডেন্টেশন আমাকে মাথা ব্যাথা দিয়েছে। তথ্যের জন্য ধন্যবাদ যদিও এটি কার্যকর!
ioan

ধন্যবাদ! আমি ইন্ডেন্টেশনটিতে কিছু পরিবর্তন করেছি, আমি আশা করি এটি এখন আরও ভাল
m01

27

আপনি আপনার settings.pyফাইলে লগিং কনফিগার করতে পারেন ।

একটি উদাহরণ:

if DEBUG:
    # will output to your console
    logging.basicConfig(
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)s %(message)s',
    )
else:
    # will output to logging file
    logging.basicConfig(
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)s %(message)s',
        filename = '/my_log_file.log',
        filemode = 'a'
    )

তবে এটি DEBUG সেট করার উপর নির্ভরশীল এবং সম্ভবত আপনি এটি কীভাবে সেট আপ করবেন তা নিয়ে চিন্তা করতে চান না। এই জবাবটি দেখুন কীভাবে আমি বলতে পারি যে আমার জ্যাঙ্গো অ্যাপ্লিকেশনটি ডেভলপমেন্ট সার্ভারে চলছে কিনা? শর্তসাপেক্ষে লেখার আরও ভাল পদ্ধতির জন্য। সম্পাদনা করুন: উপরের উদাহরণটি জ্যাঙ্গো ১.১ প্রকল্পের, জাজানোতে লগিং কনফিগারেশনটি সেই সংস্করণ থেকে কিছুটা পরিবর্তন হয়েছে।


আমি DEBUG এর উপর নির্ভর করতে চাই না; আমি বরং সেই পোস্টটিতে লিঙ্কযুক্ত ডেভ-সার্ভার সনাক্তকরণ ব্যবস্থার উপর নির্ভর করব। তবে অন্য পোস্টের সনাক্তকরণ পদ্ধতিটি একটি অনুরোধের উদাহরণটিতে অ্যাক্সেস থাকার উপর নির্ভর করে। আমি কীভাবে সেটিংস.পাইয়ে অনুরোধ পেতে পারি?
জাস্টিন গ্রান্ট

4

আমি এটি ব্যবহার:

logging.conf:

[loggers]
keys=root,applog
[handlers]
keys=rotateFileHandler,rotateConsoleHandler

[formatters]
keys=applog_format,console_format

[formatter_applog_format]
format=%(asctime)s-[%(levelname)-8s]:%(message)s

[formatter_console_format]
format=%(asctime)s-%(filename)s%(lineno)d[%(levelname)s]:%(message)s

[logger_root]
level=DEBUG
handlers=rotateFileHandler,rotateConsoleHandler

[logger_applog]
level=DEBUG
handlers=rotateFileHandler
qualname=simple_example

[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=applog_format
args=('applog.log', 'a', 10000, 9)

[handler_rotateConsoleHandler]
class=StreamHandler
level=DEBUG
formatter=console_format
args=(sys.stdout,)

testapp.py:

import logging
import logging.config

def main():
    logging.config.fileConfig('logging.conf')
    logger = logging.getLogger('applog')

    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    #logging.shutdown()

if __name__ == '__main__':
    main()

0

আপনি এটি খুব সহজেই করতে পারেন tagalog(https://github.com/dorkitude/tagolog)

উদাহরণস্বরূপ, স্ট্যান্ডার্ড পাইথন মডিউলটি অ্যাপেনড মোডে খোলা একটি ফাইল অবজেক্টে লেখার সময়, অ্যাপ ইঞ্জিন মডিউল (https://github.com/dorkitude/tagolog/blob/master/tagalog_appengine.py) এই আচরণটি ওভাররাইড করে এবং এর পরিবর্তে ব্যবহার করে logging.INFO

অ্যাপ ইঞ্জিন প্রকল্পে এই আচরণটি পেতে, সহজেই কেউ এটি করতে পারে:

import tagalog.tagalog_appengine as tagalog
tagalog.log('whatever message', ['whatever','tags'])

আপনি নিজেই মডিউলটি প্রসারিত করতে এবং অনেক অসুবিধা ছাড়াই লগ ফাংশনটিকে ওভাররাইট করতে পারেন।


0

এটি আমার লোকাল.পি-তে বেশ কার্যকরভাবে কাজ করে, নিয়মিত লগিংয়ের জন্য আমাকে ঝামেলা বাঁচায়:

from .settings import *

LOGGING['handlers']['console'] = {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler',
    'formatter': 'verbose'
}
LOGGING['loggers']['foo.bar'] = {
    'handlers': ['console'],
    'propagate': False,
    'level': 'DEBUG',
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.