log4net กับ Nlog


355

ใครมีประสบการณ์สำหรับทั้งสอง? พวกเขาจะกองซ้อนกันได้อย่างไร

เราวางแผนที่จะใช้หนึ่งในนั้นเพื่อเข้าสู่ระบบในแอปพลิเคชันระดับองค์กร

อ้างอิง:

log4net

NLog

แก้ไข: เราไม่มีการอ้างอิงที่มีอยู่กับ nlog หรือ log4net


9
นี่คือตัวบันทึกที่ฉันใช้: System.IO.File.AppendAllText (@ "c: \ log.txt", string.Format ("{0} \ r \ n", ข้อความ));
zumalifeguard

213
ที่ดีสำหรับคุณ แต่บางคนอาจจะต้องมีความสามารถที่จะทำให้การเข้าสู่ระบบเปิด / ปิดแบบไดนามิกการใช้ระดับการเข้าสู่ระบบที่แตกต่างกันที่จะลบข้อมูลบันทึกเก่า ฯลฯ โดยอัตโนมัติ
Tor Hovland

23
ควรสังเกตว่าเอกสาร Log4Net นั้นแย่มาก
BentOnCoding

มีการโพสต์บล็อกรายละเอียดrobertmccarter.com/switching-to-nlog
Michael Freidgeim

2
คุณควรลอง ReflectInsight มีประสิทธิภาพมากขึ้นแล้วทั้งinsightextensions.codeplex.com
code5

คำตอบ:


383

ฉันเพิ่งได้รับมอบหมายให้ "สร้างต้นแบบการบันทึกบางส่วน" สำหรับโครงการที่กำลังจะมาถึง ฉันไม่มีประสบการณ์ในกรอบการบันทึกใด ๆ ฉันค้นคว้าวิ่งผ่านแบบฝึกหัดทำแอพของเล่น ฯลฯ บน Log4Net, NLog และ Enterprise Library สองสามวัน กลับมาอีก 3-4 สัปดาห์ต่อมาและรวบรวมพวกเขาเข้าด้วยกันเป็นตัวอย่างที่เหนียวแน่น หวังว่าสิ่งนี้มีประโยชน์สำหรับคุณ

คำแนะนำของฉันสำหรับโครงการของเราคือ:

  1. ใช้ซุ้มการบันทึก (เช่นCommon.Logging , SimpleLoggingFacade ) เพื่อหลีกเลี่ยงการพึ่งพาโดยตรง
  2. หากเราลงเอยด้วยการใช้ Enterprise Library สำหรับสิ่งอำนวยความสะดวกอื่น ๆ จากนั้นใช้สำหรับการบันทึกด้วยเช่นกัน
  3. หากเราลงเอยด้วยการใช้บางสิ่งด้วยการพึ่งพา Log4Net ให้ใช้ Log4Net
  4. หากไม่มีการข้างต้นใช้ NLog ซึ่งฉันต้องการ

ที่อยู่บนพื้นฐานของการค้นพบเหล่านี้ (ความคิดเห็น!):

  • ทั้งสามกรอบมีความสามารถและสามารถทำสิ่งที่ซับซ้อน เราต้องการโซลูชันที่มีคุณภาพ แต่ตรงไปตรงมาไม่ต้องการประสิทธิภาพสูงพิเศษหรือการรับเหตุการณ์ 60 ประเภท
  • ทั้ง 3 มีแนวคิดพื้นฐานที่คล้ายกันมาก
  • แต่ละคนมีเทคนิคเจ๋ง ๆ ของตัวเองเช่นการกำหนดเส้นทางขั้นสูงหรือชื่อไฟล์บันทึกแบบไดนามิกการตัดทอนไฟล์ ฯลฯ
  • เอกสารทั้ง 3 นี้ค่อนข้างดีในแบบของพวกเขาเอง
  • สำหรับ newb ที่สมบูรณ์แบบเช่นฉันพวกเขาทั้งหมดอึดอัดเล็กน้อยในตอนแรก ไม่มีความแตกต่างอย่างมากที่นี่สำหรับพื้นฐาน ฉันเข้าใจแล้ว
  • เมื่อมาถึงสิ่งที่ไม่กี่สัปดาห์ต่อมา NLog เห็นได้ชัดว่าเป็นวิธีที่ง่ายที่สุดที่จะดำเนินการต่อ ฉันต้องการแปรงขึ้นมาเล็กน้อย ด้วย Log4Net ฉันต้องทบทวนตัวอย่างออนไลน์บางอย่างเพื่อไปให้ได้ ด้วย EntLib ฉันเลิกและทำแบบฝึกหัดทั้งหมดอีกครั้งตั้งแต่เริ่มต้น - ฉันหลงทางไปหมด
  • ฉันไม่สามารถหาวิธีการให้ EntLib ทำบางอย่างเช่นเข้าสู่ฐานข้อมูล อาจจะง่าย แต่ก็เกินเวลาที่กำหนด
  • Log4Net และ NLog มีรอยเท้าขนาดเล็กในโค้ด EntLib เป็นสแปม แต่ฉันจะใช้ด้านหน้าของมันอยู่ดี
  • ฉันเผลอกำหนดค่า EntLib โดยไม่ได้ตั้งใจและมันบอกฉันตอนรันไทม์ Log4Net ไม่ได้ ฉันไม่ได้ตั้งค่าผิดพลาดกับ NLog โดยไม่ตั้งใจ
  • EntLib มาพร้อมกับแอพ editor.config ที่ดูดีซึ่งคุณต้องการ 100% NLog มีสกีมาไฟล์กำหนดค่าเพื่อให้คุณได้รับ "Intellisense" Log4Net มาพร้อมกับ nada

เห็นได้ชัดว่าฉันชอบ NLog จนถึงตอนนี้ ไม่เพียงพอที่จะใช้ทั้งๆที่มีวิธีแก้ไขปัญหาอื่นที่ใช้ได้


19
+1 ในการแนะนำการสร้างซุ้มหน้าสำหรับการแยกข้อกังวลที่แท้จริง (SoC) หรือดังนั้นคุณจึงไม่ได้ polute โดเมนของคุณ
eduncan911

66
ซุ้มทำงานเฉพาะถ้าคุณสามารถทำมันได้โดยไม่ทำลายค่าวินิจฉัยที่ขึ้นอยู่กับการเรียกกองอื่น ๆ ที่ผมเคยเห็นจำนวนมากของอาคารที่แตกคุณลักษณะวินิจฉัยเหล่านี้จำเป็นที่สิ้นสุดการทำอันตรายมากขึ้นที่ดี ...
เจมส์ Schek

11
Log4Net ยังไม่สนับสนุนส่วนกำหนดค่าไคลเอนต์ของ. NET 3.5 SP1 และ. NET 4 เนื่องจากเป็นการอ้างอิง System.Web แค่ต้องการชี้ให้เห็นถึงแม้ว่าจริงๆแล้วมันเกี่ยวข้องอย่างใกล้ชิดกับ 'ด้วยการพึ่งพา Log4Net ให้ใช้ Log4Net'
Simon D.

59
NLog ได้รับการสนับสนุนอย่างแข็งขัน ( nlog-project.org/download ) ในขณะที่ Log4Net ยังไม่ได้รับการอัปเดตตั้งแต่รุ่น 1.2.10 เผยแพร่เมื่อวันที่ 19 เมษายน 2549 ( problems.apache.org/jira/browse/LOG4NET/fixforversion/11128 )
Jay Cincotta

5
หากคุณมีการพึ่งพาไลบรารีโดยใช้ log4net และต้องการใช้ NLog แทน (หรือในทางกลับกัน) มันค่อนข้างตรงไปตรงมาในการเขียนและกำหนดค่าคลาส Appender ที่กำหนดเองเพื่อเชื่อมทั้งสอง
dbkk

158

การพิจารณาที่สำคัญที่ไม่ได้กล่าวถึงมากคือการสนับสนุนและอัปเดต

Log4Net ยังไม่ได้รับการปรับปรุงตั้งแต่รุ่น 1.2.10 ถูกตีพิมพ์ 19 เมษายน 2006

ในทางตรงกันข้าม NLog ได้รับการสนับสนุนอย่างแข็งขันตั้งแต่ปี 2549 ในไม่ช้าจะมีการปล่อยNLog 2.0 ที่รองรับหลายแพลตฟอร์มที่ไม่มีอยู่เมื่อ log4net ได้รับการปรับปรุงล่าสุดเช่น:

  • NET Framework 2.0 SP1 และสูงกว่า 3.5 & 4.0 (ไคลเอนต์และโปรไฟล์เพิ่มเติม)
  • Silverlight 2.0, 3.0, 4.0
  • .NET Compact Framework 2.0, 3.5
  • โปรไฟล์โมโน 2.x

30
แต่มันจำเป็นต้องอัพเดทหรือไม่? ถ้ามันไม่พังไม่ต้องแก้ไขเหรอ?
glenneroo

24
มันจะเสีย: ความละเอียด * messes up IP Address ระหว่าง IPv4 / IPv6 สำหรับ localhost บน Vista และ Win7 (แพทช์หลายอย่างไม่เป็นทางการลอยรอบ) * ไม่รวบรวมในรายละเอียดสุทธิ 4.0 ไคลเอ็นต์
Tormod Hystad

6
ดูเหมือนจะเป็นเวอร์ชั่น. NET 4.0 ในงานสำหรับ Log4Net
scope_creep

38
log4net ได้เปิดตัวใน v1.2.11 ตุลาคม 2011 ฉันคิดว่าคำตอบนี้ล้าสมัยแล้ว
Mariano Desanze

83
จริงๆแล้วคำตอบนี้ยังคงมีค่าสำหรับฉัน ฉันกำลังอยู่ในขั้นตอนการเลือกคนตัดไม้และคำตอบนี้บอกเราว่า log4net ได้รับการปรับปรุงอีกครั้งในช่วงครึ่งทศวรรษที่ผ่านมาในขณะที่ NLog เป็นโครงการที่ใช้งานมากขึ้น
Batibix

97

เมื่อเร็ว ๆ นี้ฉันมีประสบการณ์กับกรอบทั้งสองฉันคิดว่าฉันสามารถแบ่งปันมุมมองของฉันในแต่ละกรอบ

ฉันถูกขอให้ประเมินเฟรมเวิร์กการบันทึกสำหรับเว็บแอ็พพลิเคชันที่มีอยู่ฉัน จำกัด ขอบเขตตัวเลือกของฉันเป็น NLog (v2.0) และ log4net (v1.2.11) หลังจากผ่านฟอรัมออนไลน์ต่างๆ นี่คือสิ่งที่ฉันค้นพบ:

  1. การตั้งค่า / การเริ่มต้นใช้งาน NLog นั้นง่ายมาก คุณผ่านบทช่วยสอนการเริ่มต้นใช้งานบนเว็บไซต์ของพวกเขาและคุณทำเสร็จแล้ว คุณได้รับความคิดที่เป็นธรรมสิ่งที่อาจเป็นกับ nlog ไฟล์กำหนดค่านั้นใช้งานง่ายจนใคร ๆ ก็สามารถเข้าใจการกำหนดค่าได้ ตัวอย่างเช่น: หากคุณต้องการตั้งค่าการล็อกภายในคุณตั้งค่าแฟล็กในโหนดส่วนหัวของไฟล์ Nlog config ซึ่งเป็นตำแหน่งที่คุณคาดว่าจะเป็น ใน log4net คุณตั้งค่าสถานะแตกต่างกันในส่วน appSettings ของ web.config

  2. ใน log4net การบันทึกภายในไม่ได้ประทับเวลาเอาท์พุทซึ่งน่ารำคาญ ใน Nlog คุณจะได้รับบันทึกที่ดีด้วยการประทับเวลา ฉันพบว่ามันมีประโยชน์มากในการประเมินของฉัน

  3. ตัวกรองใน log4net - คุณควรตรวจสอบคำถามของฉัน - ตัวกรอง log4net - วิธีเขียนและตัวกรองเพื่อละเว้นข้อความบันทึกและหากคุณพบคำตอบ / วิธีแก้ปัญหานี้โปรดแจ้งให้เราทราบ ฉันเข้าใจว่ามีวิธีแก้ปัญหาสำหรับคำถามนี้เนื่องจากคุณสามารถเขียนตัวกรองที่กำหนดเองของคุณเองได้ แต่สิ่งที่ไม่สามารถหาได้ง่ายใน log4net

  4. ประสิทธิภาพ - ฉันบันทึกข้อความบันทึก 3,000 ข้อความไปยังฐานข้อมูลโดยใช้กระบวนงานที่เก็บไว้ ฉันใช้การวนรอบแบบง่าย (int i = 0; i <3000; i ++ ... ) เพื่อบันทึกข้อความเดียวกัน 3000 ครั้งสำหรับการเขียน: log4net AdoAppender ใช้เวลาเกือบสองเท่าของ NLog

  5. Log4net ไม่รองรับตัวเชื่อมต่อแบบอะซิงโครนัส

มันเป็นการเปรียบเทียบที่เพียงพอสำหรับฉันที่จะเลือก NLog เป็นกรอบการบันทึก :)


บันทึกการดีบักภายในของ log4net: logging.apache.org/log4net/release/sdk/…
Narayan Akhade

36

สำหรับใครก็ตามที่เข้ามาที่กระทู้นี้คุณอาจต้องการกลับไปดูที่. Net Base Class Library (BCL) หลายคนพลาดการเปลี่ยนแปลงระหว่าง. Net 1.1 และ. Net 2.0 เมื่อมีการแนะนำคลาสTraceSource (ประมาณปี 2005)

การใช้ TraceSource นั้นคล้ายกับกรอบการบันทึกอื่น ๆ ที่มีการควบคุมอย่างละเอียดของการบันทึกการกำหนดค่าใน app.config / web.config และการเข้าถึงทางโปรแกรมโดยไม่ต้องมีโอเวอร์เฮดของแอปพลิเคชันองค์กร

นอกจากนี้ยังมีการเปรียบเทียบจำนวนลอย: "log4net vs TraceSource"


1
EntLib กำลังขยาย TraceSource
Michael Freidgeim

34

สำหรับเราแล้วความแตกต่างที่สำคัญคือความสมบูรณ์แบบโดยรวม ...

ลองดูที่Logger.IsDebugEnabledNLog เปรียบเทียบกับ Log4Net จากการทดสอบของเรา NLog มีค่าใช้จ่ายน้อยกว่าและนั่นคือสิ่งที่เราเป็นหลังจากนั้น

ไชโย Florian


25

ก่อนอื่นดูที่สแต็กที่เหลือของคุณ

หากคุณใช้ NHibernate ระบบจะใช้ Log4Net โดยตรง กรอบงานอื่น ๆ อาจมีคนตัดไม้เฉพาะที่พวกเขาต้องการ

นอกเหนือจากนั้น: ทำงานได้ดี

ฉันใช้ Log4Net ด้วยตัวเอง อาจเป็นความเจ็บปวดในการกำหนดค่าและหากไม่ได้รับการกำหนดค่าอย่างถูกต้องมันเป็นความเจ็บปวดที่จะคิดออกสิ่งที่ผิดพลาด แต่คุณสามารถทำให้เกือบทุกอย่างที่คุณต้องการจากคนตัดไม้

หากคุณไม่มีปัญหาในการใช้งาน Log4Net ต่อไปนี้เป็นบทความที่ฉันเขียนเกี่ยวกับวิธีเริ่มต้นใช้งาน: http://elegantcode.com/2007/12/07/getting-started-with-log4net/


9
@ การรวม: โปรดทราบว่าใน NHibernate v3 การพึ่งพา log4net นั้นถูกลบออกอย่างน่าขอบคุณ - มันสามารถเสียบได้ดังนั้นคุณสามารถใช้ NLog ได้หากคุณต้องการ
UpTheCreek

NLog เป็นความเจ็บปวดที่เท่ากันในการกำหนดค่า / คิดว่ามีอะไรผิดปกติเช่นกัน อย่างน้อยกับ log4net คุณสามารถค้นหาเอกสารและหรือ google สำหรับปัญหา
Mrchief

จุดที่ดีในการพิจารณาสแต็คที่เหลือของคุณคืออะไรฉันไม่สามารถพูดได้ว่าเป็นเรื่องที่น่ากังวลที่ฉันจะพิจารณาจากส่วนหัวของฉัน ถึงแม้ว่าดูเหมือนว่า NHibernate จะไม่ใช่ตัวอย่างสำหรับสถานการณ์นี้อีกต่อไป แต่ Sitecore ก็เป็นตัวอย่างที่ร่วมสมัยเนื่องจากใช้ Log4Net ภายใน Sitecore นั้นสามารถขยายได้ดังนั้นคุณสามารถใช้สิ่งที่คุณต้องการบันทึก แต่มันซับซ้อนกว่าการแก้ไข web.config ของไซต์เพื่อเพิ่มตัวบันทึกของคุณเอง
Scott Simontis

16

ดี .. ฉันใช้ห้องสมุดองค์กรสำหรับงานบันทึกฐานข้อมูลและตอนนี้ฉันเปลี่ยนเป็น NLog เนื่องจากปัญหาคอขวดของประสิทธิภาพ

ข้อมูลเปรียบเทียบบางอย่าง:

http://pauliusraila.blogspot.com/2010/10/solving-database-logging-bottlenecks.html


14

ฉันดังก้องข้างบนและไม่ชอบ nLog Entlib ป่องโดยไม่จำเป็น

Re: Log4net สิ่งหนึ่งที่ฉันได้รับเสมอกับ log4net นั้นลืมที่จะเพิ่มสิ่งต่อไปนี้ใน global.asax เพื่อเริ่มส่วนประกอบ:

log4net.Config.XmlConfigurator.Configure();

13

ถ้าคุณไปที่นี่คุณสามารถค้นหาเมทริกซ์ที่ครอบคลุมซึ่งรวมทั้ง libog NLog และ Log4Net ตลอดจน Enterprise Lib และผลิตภัณฑ์อื่น ๆ

ใครบางคนอาจโต้แย้งว่าเมทริกซ์นั้นทำในลักษณะที่จะขีดเส้นใต้คุณลักษณะของ lib เชิงพาณิชย์เพียงอย่างเดียวที่มีอยู่ในเมทริกซ์ ฉันคิดว่ามันเป็นเรื่องจริง แต่มันก็มีประโยชน์ในการขับเคลื่อนตัวเลือกของฉันกับ NLog

ความนับถือ


1
เมื่อมองดูเมทริกซ์นั้นมันดูล้าสมัยอย่างมากเกี่ยวกับกรอบของ The Object Guy ซึ่งเป็นคู่แข่งทางการค้า
Andy Dent

9

ดังที่ฉันสังเกตเห็น log4net ล็อกไฟล์เอาต์พุตที่แอปพลิเคชันตลอดเวลาทำงานอยู่ดังนั้นคุณจึงไม่สามารถลบได้ มิฉะนั้นพวกเขาจะคล้ายกัน

ดังนั้นฉันจึงชอบ NLog


22
เพิ่ม <lockingModel type = "log4net.Appender.FileAppender + MinimalLock" /> ในการกำหนดค่า fileappender ของคุณเพื่อป้องกันสิ่งนี้ (กล่าวถึงในหน้าตัวอย่าง log4net ที่นี่: logging.apache.org/log4net/release/config-examples.html )
EventHorizon

9

เสียบด้านหน้าสำหรับโครงการที่มาเปิดผมทำงาน แต่ให้การสนทนามีชีวิตชีวาเกี่ยวกับการที่กรอบ NET เข้าสู่ระบบมีการใช้งานมากขึ้นฉันคิดว่าฉันโพสต์ลิงก์หน้าที่ที่จะSerilog

ในการใช้งานภายในแอพพลิเคชั่น Serilog นั้นคล้ายกับ log4net (และใช้งานหนัก) ซึ่งแตกต่างจากตัวเลือกการบันทึก. NET อื่น ๆ Serilog เกี่ยวกับการรักษาโครงสร้างของบันทึกเหตุการณ์สำหรับการวิเคราะห์ออฟไลน์ เมื่อคุณเขียน:

Log.Information("The answer is {Answer}", 42);

ไลบรารีการบันทึกส่วนใหญ่แสดงข้อความในสตริงทันที Serilog สามารถทำเกินไป แต่ก็เก็บรักษา{ Answer: 42 }ทรัพย์สินเพื่อให้ในภายหลังโดยใช้หนึ่งในจำนวนของร้านค้าข้อมูล NoSQL Answerคุณสามารถถูกเหตุการณ์แบบสอบถามขึ้นอยู่กับมูลค่าของ

เราอยู่ใกล้กับ 1.0 และสนับสนุนแพลตฟอร์มที่ทันสมัย ​​(.NET 4.5, Windows Store และ Windows Phone 8) ทั้งหมด


แต่คำถามก็คือ: มันรองรับ Mono ไหม? ;) ดูเหมือนสัญญา (และฉันชอบโลโก้ของเธรดและเข็ม) แต่ไม่สามารถหาข้อมูลใด ๆ ว่ามันรองรับ Mono หรือไม่
ashokgelal

คำถามที่ดี :) ... ใช่เรามีผู้ใช้บน Mono - ฉันไม่แน่ใจว่าพวกเขากำลังใช้ Serilog build แบบ. NET 4.5 หรือ 4.0 แต่ถ้าคุณพบปัญหาใด ๆ เราจะช่วยเหลือคุณ
Nicholas Blumhardt

. NET 4.5 รองรับให้ฉันดาวน์โหลดและทดลองใช้งานโซลูชันของคุณตอนนี้
Fat Shogun

8

ฉันสอง NLog ด้วยเพราะทำงานกับรหัสที่ไม่มีการจัดการด้วย ฉันคิดว่ามันอาจเป็นไปได้ที่จะใช้ log4net และ log4cxx ด้วยกัน แต่ NLog จัดการทั้งรหัสที่มีการจัดการและไม่มีการจัดการนอกกรอบ

ฉันยังดูที่Common.Loggingซุ้มที่ทำให้นามธรรมของ api การบันทึกมันรองรับ log4net, NLog และ Entreprise Library ฉันไม่คิดว่าฉันจะใช้มัน แต่ฉันชอบวิธีที่พวกเขาใช้ lambdas เพื่อปรับปรุงประสิทธิภาพเมื่อการบันทึกถูกปิดใช้งาน (คุณลักษณะที่ใช้ร่วมกับ NLog และอาจเป็นอย่างอื่น)


4

นอกจากนี้คุณยังอาจพิจารณาMicrosoft องค์กรห้องสมุดเข้าสู่ระบบที่ถูกบล็อก มันมาพร้อมกับนักออกแบบที่ดี


3
ช่วยให้คุณสามารถกำหนดค่าให้มองเห็นได้ซึ่งตรงข้ามกับการสร้าง XML ด้วยมือ ขึ้นอยู่กับรสนิยมของคุณ ...
Rashack

13
ความคิดในการใช้เครื่องมือแสดงผลสำหรับสิ่งนั้นไม่ใช่สิ่งที่ดี
Adam Dymitruk

4
อาจไม่ใช่สิ่งที่ดี แต่สำหรับตัวกำหนดค่าภาพ EntLib เป็นสิ่งที่จำเป็น การกำหนดค่าการเขียนด้วยตนเองเป็นไปไม่ได้จริงมันซับซ้อนเกินไป (คุณรู้ว่ามันมาจาก Microsoft)
Pavel Hodek

1
แม้ว่าบางคนไม่ชอบนักออกแบบภาพทำไมต้องลงคะแนน! : o
nawfal

EntLib ทำการบันทึกข้อมูลแบบซิงโครนัสซึ่งสามารถทำงานได้อย่างยอดเยี่ยม
Michael Freidgeim

2

ฉันคิดว่าฉันทามติทั่วไปคือ nlog นั้นค่อนข้างง่ายต่อการกำหนดค่าและใช้งาน ทั้งสองมีความสามารถค่อนข้าง


0

จากประสบการณ์ของฉันSmartInspectเต้นทั้ง NLog และ log4net

มันใช้งานง่ายมากเป็นเอกสารที่ยอดเยี่ยมและคุณสามารถดูและกรองข้อความที่บันทึกไว้ก่อนหน้านี้ด้วยโปรแกรมดูบันทึกการโต้ตอบซึ่งเป็นข้อได้เปรียบที่แท้จริงของโลกขนาดใหญ่

สิ่งหนึ่งที่ฉันชอบคือมุมมองข้อมูลแบบแท็บเช่นแท็บเบราว์เซอร์ใน Chrome แต่ละแท็บสามารถให้มุมมองการกรองที่แตกต่างกันของบันทึก


11
มันเป็นผลิตภัณฑ์ที่ต้องชำระเงิน NLog & Log4Net นั้นฟรี
Zo มี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.