python的logging日志模塊是什么

這篇文章給大家介紹python的logging日志模塊是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站制作、大余網(wǎng)絡(luò)推廣、成都小程序開發(fā)、大余網(wǎng)絡(luò)營銷、大余企業(yè)策劃、大余品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供大余建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

1.簡(jiǎn)單的將日志打印到屏幕

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

默認(rèn)情況下,logging將日志打印到屏幕,日志級(jí)別為WARNING;
日志級(jí)別大小關(guān)系為:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,當(dāng)然也可以自己定義日志級(jí)別。

2.通過logging.basicConfig函數(shù)對(duì)日志的輸出格式及方式做相關(guān)配置

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')
    
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

 

./myapp.log文件中內(nèi)容為:
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函數(shù)各參數(shù):
filename: 指定日志文件名
filemode: 和file函數(shù)意義相同,指定日志文件的打開模式,'w'或'a'
format: 指定輸出的格式和內(nèi)容,format可以輸出很多有用信息,如上例所示:
 %(levelno)s: 打印日志級(jí)別的數(shù)值
 %(levelname)s: 打印日志級(jí)別名稱
 %(pathname)s: 打印當(dāng)前執(zhí)行程序的路徑,其實(shí)就是sys.argv[0]
 %(filename)s: 打印當(dāng)前執(zhí)行程序名
 %(funcName)s: 打印日志的當(dāng)前函數(shù)
 %(lineno)d: 打印日志的當(dāng)前行號(hào)
 %(asctime)s: 打印日志的時(shí)間
 %(thread)d: 打印線程ID
 %(threadName)s: 打印線程名稱
 %(process)d: 打印進(jìn)程ID
 %(message)s: 打印日志信息
datefmt: 指定時(shí)間格式,同time.strftime()
level: 設(shè)置日志級(jí)別,默認(rèn)為logging.WARNING
stream: 指定將日志的輸出流,可以指定輸出到sys.stderr,sys.stdout或者文件,默認(rèn)輸出到sys.stderr,當(dāng)stream和filename同時(shí)指定時(shí),stream被忽略

3.將日志同時(shí)輸出到文件和屏幕

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')

#################################################################################################
#定義一個(gè)StreamHandler,將INFO級(jí)別或更高的日志信息打印到標(biāo)準(zhǔn)錯(cuò)誤,并將其添加到當(dāng)前的日志處理對(duì)象#
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文件中內(nèi)容為:
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

#################################################################################################
#定義一個(gè)RotatingFileHandler,最多備份5個(gè)日志文件,每個(gè)日志文件最大10M
Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5)
Rthandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
Rthandler.setFormatter(formatter)
logging.getLogger('').addHandler(Rthandler)
################################################################################################

從上例和本例可以看出,logging有一個(gè)日志處理的主對(duì)象,其它處理方式都是通過addHandler添加進(jìn)去的。
logging的幾種handle方式如下:

logging.StreamHandler: 日志輸出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志輸出到文件

日志回滾方式,實(shí)際使用時(shí)用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler

logging.handlers.SocketHandler: 遠(yuǎn)程輸出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  遠(yuǎn)程輸出日志到UDP sockets
logging.handlers.SMTPHandler:  遠(yuǎn)程輸出日志到郵件地址
logging.handlers.SysLogHandler: 日志輸出到syslog
logging.handlers.NTEventLogHandler: 遠(yuǎn)程輸出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志輸出到內(nèi)存中的制定buffer
logging.handlers.HTTPHandler: 通過"GET"或"POST"遠(yuǎn)程輸出到HTTP服務(wù)器

由于StreamHandler和FileHandler是常用的日志處理方式,所以直接包含在logging模塊中,而其他方式則包含在logging.handlers模塊中,
上述其它處理方式的使用請(qǐng)參見python2.5手冊(cè)!

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', 10*1024*1024, 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是線程安全的

from:http://blog.csdn.NET/yatere/article/details/6655445

原文地址:Python 模塊 Logging HOWTO 官方文檔

一、Logging簡(jiǎn)介

Logging是一種當(dāng)軟件運(yùn)行時(shí)對(duì)事件的追蹤記錄方式,軟件開發(fā)者通過在代碼中調(diào)用Logging的相關(guān)方法來提示某些事件的發(fā)生。事件可以通過描述信息描述,當(dāng)然描述信息中也可以包含變量,因?yàn)閷?duì)于事件的每次觸發(fā),描述信息可能不同。

二、簡(jiǎn)單的例子

一個(gè)簡(jiǎn)單的例子:

import logging
logging.warning('Watch out!')  # 信息會(huì)打印到控制臺(tái)
logging.info('I told you so')  # 不會(huì)打印任何信息,因?yàn)槟J(rèn)級(jí)別高于info

如果你將上述代碼存入Python文件,然后運(yùn)行:

WARNING:root:Watch out!

INFO的信息沒有出現(xiàn)在控制臺(tái),因?yàn)槟J(rèn)的級(jí)別為WARNING高于INFO。日志信息包含日志級(jí)別和事件描述信息,暫且別太在意輸出中的root,稍后會(huì)有介紹。實(shí)際的輸出可以讓你任意的定制,格式設(shè)置會(huì)在稍后介紹。

三、將日志信息存入文件

在應(yīng)用中我們常常需要將日志信息存入文件。請(qǐng)重新創(chuàng)建一個(gè)新文件,不要接在上面的Python文件中。

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

運(yùn)行他,然后會(huì)生成一個(gè)日志文件example.log,打開它就能看到具體的日志信息:

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

在這個(gè)例子中,我們看到了如何設(shè)置日志級(jí)別,這是一個(gè)閾值,用于控制日志的輸出。
如果你想要通過命令行來設(shè)置日志級(jí)別,你可以這樣做:

--log=INFO

并且 你也可以獲取傳遞給–log的參數(shù),你可以這樣做:

getattr(logging, loglevel.upper())

你可以通過basicConfig()方法來設(shè)置日志級(jí)別——傳遞level參數(shù)。你可能想要檢查level參數(shù)值的合法性,可以像下面這樣:

# assuming loglevel is bound to the string value obtained from the
# command line argument. Convert to upper case to allow the user to
# specify --log=DEBUG or --log=debug
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
    raise ValueError('Invalid log level: %s' % loglevel)
logging.basicConfig(level=numeric_level, ...)

basicConfig()方法的調(diào)用先于debug(),info()等方法。因?yàn)樗且淮涡缘墓ぷ鳎旱谝淮握{(diào)用是有效的,后面的調(diào)用都是無效的空操作。

如果你多次運(yùn)行上面的代碼,日志信息會(huì)追加到原有的日志信息上。如果你想要每次的日志信息都覆蓋掉之前的,那么可以通過配置filemode參數(shù)為’w’即可:

logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)

新的日志信息會(huì)覆蓋掉舊的。

四、多模塊Logging

如果你的工程包含多個(gè)模塊,你可以像下面的這種方式組織logging:

# myapp.py
import logging
import mylib

def main():
    logging.basicConfig(filename='myapp.log', level=logging.INFO)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == '__main__':
    main()

# mylib.py
import logging

def do_something():
    logging.info('Doing something')

如果你運(yùn)行myapp.py,你會(huì)在myqpp.log中看到如下信息:

INFO:root:Started
INFO:root:Doing something
INFO:root:Finished

這正是你想要看到的。你可以將他們組織到你的多個(gè)模塊中,通過使用mylib.py的模板。注意:使用這種方式,除了通過查看事件描述,你不能判斷這個(gè)信息從何而來。如果你想要追蹤信息來源,你需要參照更加高級(jí)的教程-Logging進(jìn)階

五、Logging變量信息

為了生成包含變量的日志,你需要使用格式化的字符串,通過將變量當(dāng)成參數(shù)傳遞給描述信息,例如:

import logging
logging.warning('%s before you %s', 'Look', 'leap!')

會(huì)生成:

WARNING:root:Look before you leap!

正如你看到的,通過使用格式化字符創(chuàng)將變量合并到描述信息中。這種方式是向后兼容的:logging包中有更新的格式化可選方法,例如str.format() and string.Template。這些新的格式化方法都是支持的,但是研究它們的使用不在本文的討論范圍內(nèi)。

六、修改顯示日志信息的格式

你可以更改顯示日志信息的格式,像這樣:

import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')

運(yùn)行代碼會(huì)打印出:

DEBUG:This message should appear on the console
INFO:So should this
WARNING:And this, too

注意到?jīng)]有?先前出現(xiàn)在日志信息中的root不見了!你可以通過格式化方式生成幾乎全部的東西,這部分內(nèi)容你可以參考LogRecord的文檔。但是對(duì)于簡(jiǎn)單的應(yīng)用,你只需要知道日志級(jí)別,日志信息(包含變量的日志信息),或者再加上事件的發(fā)生時(shí)間。這些將在下一節(jié)中講到。

七、在日志信息中顯示日期時(shí)間

為了在日志信息中顯示日期時(shí)間,你需要使用%(asctime)s格式字符串。例如:

import logging
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')

運(yùn)行會(huì)生成:

2010-12-12 11:41:42,612 is when this event was logged.

默認(rèn)的日期時(shí)間顯示標(biāo)準(zhǔn)是ISO8601。如果你想要定制自己的格式,可以通過傳遞參數(shù)datefmt給basicConfig()方法,如下:

import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

會(huì)生成:

12/12/2010 11:46:36 AM is when this event was logged.

datefmt參數(shù)的格式和time.strftime()是相似的。

以上是Logging 的基礎(chǔ)教程,如果你的需求比較簡(jiǎn)單,上面介紹的用法應(yīng)該能夠滿足你的需求。

如果想更深入了解Logging模塊請(qǐng)轉(zhuǎn)到Logging高級(jí)教程。

常用handlers的使用

一、StreamHandler

流handler——包含在logging模塊中的三個(gè)handler之一。

能夠?qū)⑷罩拘畔⑤敵龅絪ys.stdout, sys.stderr 或者類文件對(duì)象(更確切點(diǎn),就是能夠支持write()和flush()方法的對(duì)象)。

只有一個(gè)參數(shù):

class logging.StreamHandler(stream=None)

日志信息會(huì)輸出到指定的stream中,如果stream為空則默認(rèn)輸出到sys.stderr。

二、FileHandler

logging模塊自帶的三個(gè)handler之一。繼承自StreamHandler。將日志信息輸出到磁盤文件上。

構(gòu)造參數(shù):

class logging.FileHandler(filename, mode='a', encoding=None, delay=False)

模式默認(rèn)為append,delay為true時(shí),文件直到emit方法被執(zhí)行才會(huì)打開。默認(rèn)情況下,日志文件可以無限增大。

三、NullHandler

空操作handler,logging模塊自帶的三個(gè)handler之一。
沒有參數(shù)。

四、WatchedFileHandler

位于logging.handlers模塊中。用于監(jiān)視文件的狀態(tài),如果文件被改變了,那么就關(guān)閉當(dāng)前流,重新打開文件,創(chuàng)建一個(gè)新的流。由于newsyslog或者logrotate的使用會(huì)導(dǎo)致文件改變。這個(gè)handler是專門為L(zhǎng)inux/unix系統(tǒng)設(shè)計(jì)的,因?yàn)樵趙indows系統(tǒng)下,正在被打開的文件是不會(huì)被改變的。
參數(shù)和FileHandler相同:

class logging.handlers.WatchedFileHandler(filename, mode='a', encoding=None, delay=False)

五、RotatingFileHandler

位于logging.handlers支持循環(huán)日志文件。

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)

參數(shù)maxBytes和backupCount允許日志文件在達(dá)到maxBytes時(shí)rollover.當(dāng)文件大小達(dá)到或者超過maxBytes時(shí),就會(huì)新創(chuàng)建一個(gè)日志文件。上述的這兩個(gè)參數(shù)任一一個(gè)為0時(shí),rollover都不會(huì)發(fā)生。也就是就文件沒有maxBytes限制。backupcount是備份數(shù)目,也就是最多能有多少個(gè)備份。命名會(huì)在日志的base_name后面加上.0-.n的后綴,如example.log.1,example.log.1,…,example.log.10。當(dāng)前使用的日志文件為base_name.log。

六、TimedRotatingFileHandler

定時(shí)循環(huán)日志handler,位于logging.handlers,支持定時(shí)生成新日志文件。

class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)

參數(shù)when決定了時(shí)間間隔的類型,參數(shù)interval決定了多少的時(shí)間間隔。如when=‘D’,interval=2,就是指兩天的時(shí)間間隔,backupCount決定了能留幾個(gè)日志文件。超過數(shù)量就會(huì)丟棄掉老的日志文件。

when的參數(shù)決定了時(shí)間間隔的類型。兩者之間的關(guān)系如下:

 'S'         |  秒

 'M'         |  分

 'H'         |  時(shí)

 'D'         |  天

 'W0'-'W6'   |  周一至周日

 'midnight'  |  每天的凌晨

utc參數(shù)表示UTC時(shí)間。

七、其他handler——SocketHandler、DatagramHandler、SysLogHandler、NtEventHandler、SMTPHandler、MemoryHandler、HTTPHandler

這些handler都不怎么常用,所以具體介紹就請(qǐng)參考官方文檔  其他handlers

下面使用簡(jiǎn)單的例子來演示handler的使用:

例子一——不使用配置文件的方式(StreamHandler):

import logging

# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
# 
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
#設(shè)置格式
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
#告訴handler使用這個(gè)格式
console.setFormatter(formatter)
# add the handler to the root logger
#為root logger添加handler
logging.getLogger('').addHandler(console)

# Now, we can log to the root logger, or any other logger. First the root...
#默認(rèn)使用的是root logger
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')

輸出到控制臺(tái)的結(jié)果:

root        : INFO     Jackdaws love my big sphinx of quartz.
myapp.area1 : INFO     How quickly daft jumping zebras vex.
myapp.area2 : WARNING  Jail zesty vixen who grabbed pay from quack.
myapp.area2 : ERROR    The five boxing wizards jump quickly.

例子二——使用配置文件的方式(TimedRotatingFileHandler) :

log.conf 日志配置文件:

[loggers]
keys=root,test.subtest,test

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=INFO
handlers=consoleHandler,fileHandler

[logger_test]
level=INFO
handlers=consoleHandler,fileHandler
qualname=tornado
propagate=0

[logger_test.subtest]
level=INFO
handlers=consoleHandler,fileHandler
qualname=rocket.raccoon
propagate=0

[handler_consoleHandler] #輸出到控制臺(tái)的handler
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[handler_fileHandler] #輸出到日志文件的handler
class=logging.handlers.TimedRotatingFileHandler
level=DEBUG
formatter=simpleFormatter
args=('rocket_raccoon_log','midnight')

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

logging.config.fileConfig('conf/log.conf')
logger = getLogging()

獲取logger方法:

def getLogging():
    return logging.getLogger("test.subtest")

配置logger并且調(diào)用:

logging.config.fileConfig('conf/log.conf')
logger = getLogging()
logger.info("this is an example!")

控制臺(tái)和日志文件中都會(huì)輸出:

[2016-07-01 09:22:06,470-test.subtest(INFO)main.py:55]this is an example!

Python 模塊中的logging模塊的handlers大致介紹就是這樣。

在配置文件中為L(zhǎng)ogger配置多個(gè)handler

使用樣例

讀取配置文件:

logging.config.fileConfig("log.conf")    # 采用配置文件

創(chuàng)建logger:

logger = logging.getLogger("simpleExample")

log.conf文件:

[loggers] #loggers列表
keys=root,main

[handlers] #handlers列表
keys=consoleHandler,fileHandler

[formatters] #formatters列表
keys=fmt

[logger_root] #root logger
level=DEBUG
handlers=consoleHandler,fileHandler #將root logger的日志信息輸出到文件和控制臺(tái)

[logger_main] #main logger
level=DEBUG
qualname=main
handlers=fileHandler

[handler_consoleHandler] #控制臺(tái)handler
class=StreamHandler
level=DEBUG
formatter=fmt
args=(sys.stdout,)

[handler_fileHandler] #循環(huán)日志文件
class=logging.handlers.RotatingFileHandler
level=DEBUG
formatter=fmt
args=('tst.log','a',20000,5,) #參數(shù)是RotatingFileHandler的__init__()的參數(shù)

[formatter_fmt] #格式
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

上述文件中,用逗號(hào)將handler隔開就可以將日志輸出到多個(gè)目的地:

handlers=consoleHandler,fileHandler #將root logger的日志信息輸出到文件和控制臺(tái)

關(guān)于python的logging日志模塊是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

本文標(biāo)題:python的logging日志模塊是什么
本文網(wǎng)址:http://muchs.cn/article38/ghhgsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站排名、Google、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司