SlideShare une entreprise Scribd logo
1  sur  86
Télécharger pour lire hors ligne
Python Logging
Me?
• 

== Chen Chun-Chia

== CCC
• MitraCloud 

>>> Python/Django

>>> Android
2
• logger, handler
• level, filter, formatter
• config
• logging flow
Python 3.4
4
>>> import logging
>>> logging.warning('haha')
WARNING:root:haha
5
>>> import logging
>>> logging.warning('haha')
WARNING:root:haha
Log level
6
>>> import logging
>>> logging.warning('haha')
WARNING:root:haha
Log message
7
>>> import logging
>>> logging.warning('haha')
WARNING:root:haha
Log level
8
>>> import logging
>>> logging.warning('haha')
WARNING:root:haha
Log message
9
>>> import logging
>>> logging.warning('haha')
WARNING:root:haha
... logger
10
>>> import logging
>>> logging.warning('haha')
WARNING:root:haha
IN
OUT
11
Logging
12
Logger Handler
13
Logger Handler
level
filter
level
filter
formatter
14
Handler
Logger Handler
level
filter
level
filter
formatter
config
Logger
15
level
16
>>> import logging
>>> logging.warning('haha')
WARNING:root:haha
Log level
17
level
level
———————
CRITICAL
ERROR
WARNING
INFO
DEBUG
50
40
30
20
10
18
level
logging.basicConfig(level=logging.ERROR)
logging.critical('critical')
logging.error('error')
logging.warning('warning')
logging.info('info')
logging.debug('debug')
CRITICAL:root:critical
ERROR:root:error
level
———————
CRITICAL
ERROR
WARNING
INFO
DEBUG
19
level
logging.basicConfig(level=logging.INFO)
logging.critical('critical')
logging.error('error')
logging.warning('warning')
logging.info('info')
logging.debug('debug')
CRITICAL:root:critical
ERROR:root:error
WARNING:root:warning
INFO:root:info
level
———————
CRITICAL
ERROR
WARNING
INFO
DEBUG
20
level
level
———————
CRITICAL
ERROR
WARNING
INFO
DEBUG
level WARNING
21
Logger Handler
Logger Handlerfilter filter
formatter
config
level level
22
Logger
23
getLogger Logger
import logging
logging.basicConfig()
logger = logging.getLogger('mylogger')
logger.error('haha')
ERROR:mylogger:haha
24
Logger
root
app1 app2
app1.a app1.b app2.c
25
Logger
root
app1 app2
app1.a app1.b app2.c
import logging
logging.basicConfig()
a = logging.getLogger('app1.a')
a.error('haha')
ERROR:app1.a:haha
26
Logger
root
app1 app2
app1.a app1.b app2.c
27
Handler
Logger Handler
Logger filter filter
formatter
config
level level
28
log
format
29
format
import logging
logging.basicConfig(format='*** %(message)s ***’)
logging.error('haha')
*** haha ***
30
format
1
2
3
4
5
6
7
import logging



logging.basicConfig(

format='%(filename)s:%(lineno)s %(message)s’
)

logging.error('haha')
a.py:7 haha
a.py
31
format
import logging
logging.basicConfig(format='*** %(message)s ***')
logging.error('haha')
*** haha ***
32
format
import logging
logging.basicConfig(format='*** %(message)s ***')
logging.error('haha')
*** haha ***
33
format
import logging
logging.basicConfig(format='*** %(message)s ***')
logging.error('haha')
*** haha ***https://docs.python.org/3.5/library/logging.html#logrecord-attributes
34
Handler
Logger Handler
Logger filter filter
formatter
config
level level
35
log
36
handler
import logging



a = logging.getLogger('mylogger')



handler = logging.FileHandler('a.log')

a.addHandler(handler)



a.error('hahaha')
hahaha
a.log
37
handler
import logging



a = logging.getLogger('mylogger')



h1 = logging.FileHandler('1.log')
h2 = logging.FileHandler('2.log')

a.addHandler(h1)

a.addHandler(h2)



a.error('hahaha')
hahaha
1.log
hahaha
2.log
38
handler
StreamHandler DatagramHandler
FileHandler SysLogHandler
NullHandler NTEventLogHandler
WatchedFileHandler SMTPHandler
BaseRotatingHandler MemoryHandler
RotatingFileHandler HTTPHandler
TimedRotatingFileHandler QueueHandler
SocketHandler
https://docs.python.org/3.5/library/logging.handlers.html
39
Handler
Handler
Logger filter filter
formatter
config
level level
Logger
40
handler
format
41
format
a = logging.getLogger('mylogger')



h1 = logging.FileHandler('1.log')
h2 = logging.FileHandler('2.log')

h1.setFormatter(
logging.Formatter('*** %(message)s ***'))

h2.setFormatter(
logging.Formatter('%(levelname)s:%(message)s'))

a.addHandler(h1)

a.addHandler(h2)



a.error('haha')
*** haha ***1.log
ERROR:haha2.log
42
Handler
Logger Handler
Logger filter filter
formatter
config
level level
43
level
handler
44
level
a = logging.getLogger('mylogger')



h1 = logging.FileHandler('1.log')
h2 = logging.FileHandler('2.log')

h1.setLevel(logging.ERROR)

h2.setLevel(logging.WARNING)



a.addHandler(h1)

a.addHandler(h2)



a.error('error')

a.warning('warning')
error1.log
error
warning
2.log
45
Handler
Logger Handler
Logger filter filter
formatter
config
level level
46
Handler
Logger Handler
Logger filter filter
formatter
config
level level
Logger Handler level
log
47
Filter log
48
Filter
class IpFilter(logging.Filter):

def filter(self, record):

record.ip = '192.168.1.2'

return True



logging.basicConfig(format='[%(ip)s] %(message)s')

a = logging.getLogger('mylogger')



f = IpFilter()

a.addFilter(f)



a.error('hahaha')
49
record: LogRecord
log
log LogRecord
Filter
class IpFilter(logging.Filter):

def filter(self, record):

record.ip = '192.168.1.2'

return True



logging.basicConfig(format='[%(ip)s] %(message)s')

a = logging.getLogger('mylogger')



f = IpFilter()

a.addFilter(f)



a.error('hahaha')
50
Filter
class IpFilter(logging.Filter):

def filter(self, record):

record.ip = '192.168.1.2'

return True



logging.basicConfig(format='[%(ip)s] %(message)s')

a = logging.getLogger('mylogger')



f = IpFilter()

a.addFilter(f)



a.error('hahaha')
[192.168.1.2] hahaha
51
Handler
Logger Handler
Logger
formatter
config
level level
filter filter
52
handler
...
53
handler
54
Handler emit
class MyHandler(logging.Handler):


def __init__(self, widget):

super(MyHandler, self).__init__()

self._widget = widget



def emit(self, record):

msg = self.format(record)


cursor = self._widget.textCursor()

cursor.insertText(msg)

cursor.insertText('n')
55
QPlainTextEdit
class MyHandler(logging.Handler):


def __init__(self, widget):

super(MyHandler, self).__init__()

self._widget = widget



def emit(self, record):

msg = self.format(record)


cursor = self._widget.textCursor()

cursor.insertText(msg)

cursor.insertText('n')
PyQt
56
57
app = QApplication(sys.argv)

a = logging.getLogger('a')



widget = QPlainTextEdit()

h = MyHandler(widget)

a.addHandler(h)

widget.show()



a.error('hihi')

a.warning('lol')



sys.exit(app.exec_())
Handler
Logger Handler
Logger
formatter
config
level level
filter filter
58
logging
...
59
dict
60
...
f = logging.Formatter(‘*** %(name)s:%(message)s ***’)



my_handler = logging.FileHandler('a.log')

my_handler.setLevel(logging.DEBUG)

my_handler.setFormatter(f)



a = logging.getLogger('my_logger')

a.setLevel(logging.INFO)

a.addHandler(my_handler)



a.error('error')

a.info('info')
61
Dict Logging
f = logging.Formatter(‘*** %(name)s:%(message)s ***’)



my_handler = logging.FileHandler('a.log')

my_handler.setLevel(logging.DEBUG)

my_handler.setFormatter(f)



a = logging.getLogger('my_logger')

a.setLevel(logging.INFO)

a.addHandler(my_handler)



a.error('error')

a.info('info')
config = {

'version': 1,

'formatters': {

'my_formatter': {

'format': '*** %(name)s:%(message)s ***'

},

},

'handlers': {

'my_handler': {

'level': 'DEBUG',

'class': 'logging.FileHandler',

'filename': 'a.log',

'formatter': 'my_formatter',

}

},

'loggers': {

'my_logger': {

'level': 'INFO',

'handlers': ['my_handler'],

}

},

}
62
Dict Logging
f = logging.Formatter(‘*** %(name)s:%(message)s ***’)



my_handler = logging.FileHandler('a.log')

my_handler.setLevel(logging.DEBUG)

my_handler.setFormatter(f)



a = logging.getLogger('my_logger')

a.setLevel(logging.INFO)

a.addHandler(my_handler)



a.error('error')

a.info('info')
config = {

'version': 1,

'formatters': {

'my_formatter': {

'format': '*** %(name)s:%(message)s ***'

},

},

'handlers': {

'my_handler': {

'level': 'DEBUG',

'class': 'logging.FileHandler',

'filename': 'a.log',

'formatter': 'my_formatter',

}

},

'loggers': {

'my_logger': {

'level': 'INFO',

'handlers': ['my_handler'],

}

},

}
from logging.config import dictConfig

dictConfig(config)
63
...
from logging.config import dictConfig

dictConfig(config)


a = logging.getLogger('my_logger')



a.error('error')

a.info('info')
64
65
...
f = logging.Formatter(‘*** %(name)s:%(message)s ***’)



my_handler = logging.FileHandler('a.log')

my_handler.setLevel(logging.DEBUG)

my_handler.setFormatter(f)



a = logging.getLogger('my_logger')

a.setLevel(logging.INFO)

a.addHandler(my_handler)



a.error('error')

a.info('info')
66
logging
f = logging.Formatter(‘*** %(name)s:%(message)s ***’)



my_handler = logging.FileHandler('a.log')

my_handler.setLevel(logging.DEBUG)

my_handler.setFormatter(f)



a = logging.getLogger('my_logger')

a.setLevel(logging.INFO)

a.addHandler(my_handler)



a.error('error')

a.info('info')
[formatters]

keys=my_formatter



[handlers]

keys=my_handler



[loggers]

keys=root,my_logger
[formatter_my_formatter]

format=*** %(name)s:%(message)s ***



[handler_my_handler]

level=DEBUG

class=FileHandler

formatter=my_formatter

args=('a.log',)



[logger_my_logger]

level=INFO

handlers=my_handler

qualname=my_logger



[logger_root]

handlers=
my_logging.cfg
67
logging
f = logging.Formatter(‘*** %(name)s:%(message)s ***’)



my_handler = logging.FileHandler('a.log')

my_handler.setLevel(logging.DEBUG)

my_handler.setFormatter(f)



a = logging.getLogger('my_logger')

a.setLevel(logging.INFO)

a.addHandler(my_handler)



a.error('error')

a.info('info')
[formatters]

keys=my_formatter



[handlers]

keys=my_handler



[loggers]

keys=root,my_logger
[formatter_my_formatter]

format=*** %(name)s:%(message)s ***



[handler_my_handler]

level=DEBUG

class=FileHandler

formatter=my_formatter

args=('a.log',)



[logger_my_logger]

level=INFO

handlers=my_handler

qualname=my_logger



[logger_root]

handlers=
my_logging.cfg
from logging.config import fileConfig

fileConfig('my_logging.cfg')
68
...
from logging.config import fileConfig

fileConfig('my_logging.cfg')


a = logging.getLogger('my_logger')



a.error('error')

a.info('info')
69
70
%(xxx)s
defaults
71
[formatters]

keys=my_formatter



[handlers]

keys=my_handler



[loggers]

keys=root,my_logger
[formatter_my_formatter]

format=*** %(name)s:%(message)s ***



[handler_my_handler]

level=DEBUG

class=FileHandler

formatter=my_formatter

args=('a.log',)



[logger_my_logger]

level=INFO

handlers=my_handler

qualname=my_logger



[logger_root]

handlers=
72
[formatters]

keys=my_formatter



[handlers]

keys=my_handler



[loggers]

keys=root,my_logger
[formatter_my_formatter]

format=*** %(name)s:%(message)s ***



[handler_my_handler]

level=DEBUG

class=FileHandler

formatter=my_formatter

args=('%(my_log_file)s',)



[logger_my_logger]

level=INFO

handlers=my_handler

qualname=my_logger



[logger_root]

handlers=
%(xxx)s
73
[formatters]

keys=my_formatter



[handlers]

keys=my_handler



[loggers]

keys=root,my_logger
[formatter_my_formatter]

format=*** %(name)s:%(message)s ***



[handler_my_handler]

level=DEBUG

class=FileHandler

formatter=my_formatter

args=('%(my_log_file)s',)



[logger_my_logger]

level=INFO

handlers=my_handler

qualname=my_logger



[logger_root]

handlers=
fileConfig(
'my_logging.cfg',
defaults={'my_log_file': 'a.log'}
)
defaults
74
...
75
basicConfig
76
basicConfig
StreamHandler + default Formatter
root logger
level, format, filename, …
77
basicConfig
logging.basicConfig(level=logging.ERROR)
level
logging.basicConfig(format='*** %(message)s ***')
format
logging.basicConfig(filename='a.log')
filename
78
basicConfig
logging.basicConfig(
level=logging.ERROR,
format='*** %(message)s ***',
filename='a.log'
)
level format filename
79
Handler
Logger Handler
level
filter
level
filter
formatter
config
Logger
80
logging
log
81
LogRecord
logger.info('xxx') logger
level
logger filter
record
YES
YES
NO
NO
bye
bye
handler
YES
bye bye
NO
parent logger
YES
NO logger
propagate
parent logger
82
YES
handler
YES logger
propagate
YES
NO
bye
YES
NO
bye
handler
level
handler filter
record
83
https://docs.python.org/3.5/howto/logging.html#logging-flow
84
Basic Tutorial & Advanced Tutorial
https://docs.python.org/3.5/howto/logging.html
Logging Cookbook
https://docs.python.org/3.5/howto/logging-cookbook.html
Python Library Document
https://docs.python.org/3.5/library/logging.html
85
Thank You

Contenu connexe

Tendances

Yapcasia2011 - Hello Embed Perl
Yapcasia2011 - Hello Embed PerlYapcasia2011 - Hello Embed Perl
Yapcasia2011 - Hello Embed Perl
Hideaki Ohno
 

Tendances (20)

Turbo charge your logs
Turbo charge your logsTurbo charge your logs
Turbo charge your logs
 
Yapcasia2011 - Hello Embed Perl
Yapcasia2011 - Hello Embed PerlYapcasia2011 - Hello Embed Perl
Yapcasia2011 - Hello Embed Perl
 
Ida python intro
Ida python introIda python intro
Ida python intro
 
BSDM with BASH: Command Interpolation
BSDM with BASH: Command InterpolationBSDM with BASH: Command Interpolation
BSDM with BASH: Command Interpolation
 
How Functions Work
How Functions WorkHow Functions Work
How Functions Work
 
Exploit Research and Development Megaprimer: Unicode Based Exploit Development
Exploit Research and Development Megaprimer: Unicode Based Exploit DevelopmentExploit Research and Development Megaprimer: Unicode Based Exploit Development
Exploit Research and Development Megaprimer: Unicode Based Exploit Development
 
PuppetConf 2017: Use Puppet to Tame the Dockerfile Monster- Bryan Belanger, A...
PuppetConf 2017: Use Puppet to Tame the Dockerfile Monster- Bryan Belanger, A...PuppetConf 2017: Use Puppet to Tame the Dockerfile Monster- Bryan Belanger, A...
PuppetConf 2017: Use Puppet to Tame the Dockerfile Monster- Bryan Belanger, A...
 
Voxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with JavassistVoxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with Javassist
 
Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]
Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]
Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]
 
Intro To Spring Python
Intro To Spring PythonIntro To Spring Python
Intro To Spring Python
 
Exploit Research and Development Megaprimer: DEP Bypassing with ROP Chains
Exploit Research and Development Megaprimer: DEP Bypassing with ROP ChainsExploit Research and Development Megaprimer: DEP Bypassing with ROP Chains
Exploit Research and Development Megaprimer: DEP Bypassing with ROP Chains
 
The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.
 
Get your teeth into Plack
Get your teeth into PlackGet your teeth into Plack
Get your teeth into Plack
 
Con-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With JavassistCon-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With Javassist
 
node ffi
node ffinode ffi
node ffi
 
Monit - NHRuby May 2009
Monit - NHRuby May 2009Monit - NHRuby May 2009
Monit - NHRuby May 2009
 
Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.
 
Php Debugger
Php DebuggerPhp Debugger
Php Debugger
 
Metadata-driven Testing
Metadata-driven TestingMetadata-driven Testing
Metadata-driven Testing
 
Getting Testy With Perl6
Getting Testy With Perl6Getting Testy With Perl6
Getting Testy With Perl6
 

Similaire à 20151024 Taichung.py 講一些 Python Logging

Java Logging discussion Log4j,Slf4j
Java Logging discussion Log4j,Slf4jJava Logging discussion Log4j,Slf4j
Java Logging discussion Log4j,Slf4j
Rajiv Gupta
 
I have written the code below import os import sys import html import.docx
I have written the code below  import os import sys import html import.docxI have written the code below  import os import sys import html import.docx
I have written the code below import os import sys import html import.docx
hendriciraida
 

Similaire à 20151024 Taichung.py 講一些 Python Logging (20)

Log4j in 8 slides
Log4j in 8 slidesLog4j in 8 slides
Log4j in 8 slides
 
Log4jprop example
Log4jprop exampleLog4jprop example
Log4jprop example
 
Java Logging discussion Log4j,Slf4j
Java Logging discussion Log4j,Slf4jJava Logging discussion Log4j,Slf4j
Java Logging discussion Log4j,Slf4j
 
Low Latency Logging with RabbitMQ (Brno PHP, CZ - 20th Sep 2014)
Low Latency Logging with RabbitMQ (Brno PHP, CZ - 20th Sep 2014)Low Latency Logging with RabbitMQ (Brno PHP, CZ - 20th Sep 2014)
Low Latency Logging with RabbitMQ (Brno PHP, CZ - 20th Sep 2014)
 
Log4jxml ex
Log4jxml exLog4jxml ex
Log4jxml ex
 
Low Latency Logging with RabbitMQ (PHP London - 4th Sep 2014)
Low Latency Logging with RabbitMQ (PHP London - 4th Sep 2014)Low Latency Logging with RabbitMQ (PHP London - 4th Sep 2014)
Low Latency Logging with RabbitMQ (PHP London - 4th Sep 2014)
 
World of Logging
World of LoggingWorld of Logging
World of Logging
 
Log4j Logging Mechanism
Log4j Logging MechanismLog4j Logging Mechanism
Log4j Logging Mechanism
 
Logging
LoggingLogging
Logging
 
Functional python
Functional pythonFunctional python
Functional python
 
Take My Logs. Please!
Take My Logs. Please!Take My Logs. Please!
Take My Logs. Please!
 
PHP7 is coming
PHP7 is comingPHP7 is coming
PHP7 is coming
 
I have written the code below import os import sys import html import.docx
I have written the code below  import os import sys import html import.docxI have written the code below  import os import sys import html import.docx
I have written the code below import os import sys import html import.docx
 
جلسه پنجم پایتون برای هکر های قانونی دوره مقدماتی پاییز ۹۲- ارائه ۱
جلسه پنجم پایتون برای هکر های قانونی دوره مقدماتی پاییز ۹۲- ارائه ۱جلسه پنجم پایتون برای هکر های قانونی دوره مقدماتی پاییز ۹۲- ارائه ۱
جلسه پنجم پایتون برای هکر های قانونی دوره مقدماتی پاییز ۹۲- ارائه ۱
 
Play Framework Logging
Play Framework LoggingPlay Framework Logging
Play Framework Logging
 
Getting modern with logging via log4perl
Getting modern with logging via log4perlGetting modern with logging via log4perl
Getting modern with logging via log4perl
 
Logging with Logback in Scala
Logging with Logback in ScalaLogging with Logback in Scala
Logging with Logback in Scala
 
Log4j2
Log4j2Log4j2
Log4j2
 
Hacking with hhvm
Hacking with hhvmHacking with hhvm
Hacking with hhvm
 
An introduction to PHP 5.4
An introduction to PHP 5.4An introduction to PHP 5.4
An introduction to PHP 5.4
 

Dernier

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 

Dernier (20)

%in Durban+277-882-255-28 abortion pills for sale in Durban
%in Durban+277-882-255-28 abortion pills for sale in Durban%in Durban+277-882-255-28 abortion pills for sale in Durban
%in Durban+277-882-255-28 abortion pills for sale in Durban
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 

20151024 Taichung.py 講一些 Python Logging