|
| 1 | +namespaceMicrosoft.VisualStudio.FSharp.Logging |
| 2 | +openSystem |
| 3 | +openSystem.Collections.Generic |
| 4 | +openSystem.Windows.Media |
| 5 | +openSystem.ComponentModel.Composition |
| 6 | +openMicrosoft.VisualStudio.FSharp |
| 7 | +openMicrosoft.VisualStudio |
| 8 | +openMicrosoft.VisualStudio.Text |
| 9 | +openMicrosoft.VisualStudio.Text.Classification |
| 10 | +openMicrosoft.VisualStudio.Utilities |
| 11 | +openMicrosoft.VisualStudio.Shell |
| 12 | +openMicrosoft.VisualStudio.Shell.Interop |
| 13 | +openMicrosoft.VisualStudio.ComponentModelHost |
| 14 | + |
| 15 | +[<RequireQualifiedAccess>] |
| 16 | +typeLogType= |
| 17 | +| Info |
| 18 | +| Warn |
| 19 | +| Error |
| 20 | +| Message |
| 21 | +overridex.ToString()= |
| 22 | +match xwith |
| 23 | +| Message->"Message" |
| 24 | +| Info->"Information" |
| 25 | +| Warn->"Warning" |
| 26 | +| Error->"Error" |
| 27 | + |
| 28 | + |
| 29 | +moduleConfig= |
| 30 | + |
| 31 | +let [<Literal>]fsharpOutputGuidString="E721F849-446C-458C-997A-99E14A04CFD3" |
| 32 | +letfsharpOutputGuid= Guid fsharpOutputGuidString |
| 33 | + |
| 34 | +openConfig |
| 35 | + |
| 36 | + |
| 37 | + |
| 38 | +type[<Export>]Logger[<ImportingConstructor>] |
| 39 | +([<Import(typeof<SVsServiceProvider>)>] serviceProvider: IServiceProvider)= |
| 40 | +letoutputWindow= serviceProvider.GetService<SVsOutputWindow,IVsOutputWindow>() |
| 41 | + |
| 42 | +letcreatePane()= |
| 43 | + outputWindow.CreatePane |
| 44 | +(ref fsharpOutputGuid,"F# Language Service", Convert.ToInt32true, Convert.ToInt32false)|> ignore |
| 45 | +do createPane() |
| 46 | + |
| 47 | +letgetPane()= |
| 48 | +match outputWindow.GetPane(ref fsharpOutputGuid)with |
| 49 | +|0, pane-> pane.Activate()|>ignore; Some pane |
| 50 | +|_,_-> None |
| 51 | + |
| 52 | +static let mutableglobalServiceProvider:IServiceProvider option= None |
| 53 | + |
| 54 | +static memberGlobalServiceProvider |
| 55 | +with get()= globalServiceProvider|> Option.getOrElse(ServiceProvider.GlobalProvider:> IServiceProvider) |
| 56 | +andset v= globalServiceProvider<- Some v |
| 57 | + |
| 58 | +member__.FSharpLoggingPane |
| 59 | +with get()= getPane()|>function |
| 60 | +| Some pane-> Some pane |
| 61 | +| None-> createPane(); getPane() |
| 62 | + |
| 63 | + |
| 64 | +memberself.Log(msgType:LogType,msg:string)= |
| 65 | +lettime= DateTime.Now.ToString("hh:mm:ss tt") |
| 66 | +match self.FSharpLoggingPane, msgTypewith |
| 67 | +| None,_->() |
| 68 | +| Some pane, LogType.Message-> String.Format("[F#][{0}{1}] {2}{3}","", time, msg, Environment.NewLine)|> pane.OutputString|> ignore |
| 69 | +| Some pane, LogType.Info-> String.Format("[F#][{0}{1}] {2}{3}","INFO", time, msg, Environment.NewLine)|> pane.OutputString|> ignore |
| 70 | +| Some pane, LogType.Warn-> String.Format("[F#][{0}{1}] {2}{3}","WARN", time, msg, Environment.NewLine)|> pane.OutputString|> ignore |
| 71 | +| Some pane, LogType.Error-> String.Format("[F#][{0}{1}] {2}{3}","ERROR", time, msg, Environment.NewLine)|> pane.OutputString|> ignore |
| 72 | + |
| 73 | + |
| 74 | +[<AutoOpen>] |
| 75 | +moduleLogging= |
| 76 | + |
| 77 | +letprivatelogger=lazy Logger(Logger.GlobalServiceProvider) |
| 78 | +letprivatelog logType msg= logger.Value.Log(logType,msg) |
| 79 | + |
| 80 | +letlogMsg msg= log LogType.Message msg |
| 81 | +letlogInfo msg= log LogType.Info msg |
| 82 | +letlogWarning msg= log LogType.Warn msg |
| 83 | +letlogError msg= log LogType.Error msg |
| 84 | + |
| 85 | +letlogMsgf msg= Printf.kprintf(log LogType.Message) msg |
| 86 | +letlogInfof msg= Printf.kprintf(log LogType.Info) msg |
| 87 | +letlogWarningf msg= Printf.kprintf(log LogType.Warn) msg |
| 88 | +letlogErrorf msg= Printf.kprintf(log LogType.Error) msg |
| 89 | + |
| 90 | +letlogException(ex:Exception)= |
| 91 | + logErrorf"Exception Message:%s\nStack Trace:%s" ex.Message ex.StackTrace |
| 92 | + |
| 93 | +letlogExceptionWithContext(ex:Exception,context)= |
| 94 | + logErrorf"Context:%s\nException Message:%s\nStack Trace:%s" context ex.Message ex.StackTrace |
| 95 | + |